首页 > 编程语言 >C# 类(二)——成员:属性、方法、事件

C# 类(二)——成员:属性、方法、事件

时间:2024-08-27 13:23:06浏览次数:14  
标签:p1 Console C# 成员 public Person int age 属性

目录

1、类的成员

类具有表示其数据和行为的成员。 类的成员包括在类中声明的所有成员,以及在该类的继承层次结构中的所有类中声明的所有成员(构造函数和析构函数除外)。 基类中的私有成员被继承,但不能从派生类访问。
对类的理解可参考:C# 类(一)——类库、命名空间、类、对象

类中可包含的成员类型:字段(field)、属性(property)、方法(method)、事件(event)等。

2、字段(field)

字段是直接在类或结构体中声明的任何类型的变量。 类可以拥有实例字段或静态字段,或同时拥有两者。实例字段用来描述对象的状态,静态字段用来描述类的状态。也就是说,静态字段属于类本身,在类的所有对象中共享,从对象A所作的更改将立刻呈现在对象B和C上;而实例字段属于每个对象,修改A的实例字段,并不影响B和C。
声明字段:访问级别 类型 名称
字段一般是私有的或受保护的,字段应通过属性、方法、索引器间接访问,这样做可以避免字段输入无效的值。比方说,类的实例字段,我们为这个类创建了对象,对象并不能直接访问字段,而需要通过属性、方法、索引器来间接访问,直接访问的话,哪怕我们给字段输入一个无效的值,程序也不知道,间接访问,我们可以添加判断逻辑,输入无效值时给出错误信息。

namespace Test
{
    public class Person
    {
    	//实例字段
        //公共字段(一般不推荐)
        public int age;

        //实例字段 私有字段
        private int height;

        //实例字段 私有字段
        private int weight;

		//静态字段 私有字段
		private static int avgAge;

		//静态字段 私有字段
        private static int avgHeight;

		//静态字段 私有字段
        private static int avgWeight;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.age = 300; //访问公共字段,输入无效值,但是程序并不知道
            Console.WriteLine("年龄:" + p1.age); 
            Console.ReadLine();
        }
    }
}

声明字段时可以使用赋值运算符为字段指定一个初始值。

namespace Test
{
    public class Person
    {
    	//为字段指定初始值
        public int age = 20;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            Console.WriteLine("年龄:" + p1.age); 
            Console.ReadLine();
        }
    }
}

字段的初始化紧靠调用对象实例的构造函数之前。 如果构造函数为字段赋值,则该值将覆盖字段声明期间给出的任何值。

namespace Test
{
    public class Person
    {
        public int age=20;
        
        public Person()
        {
            age = 15;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            Console.WriteLine("年龄:" + p1.age); //输出为 15
            Console.ReadLine();
        }
    }
}

可以将字段声明为 readonly, 只读字段只能在初始化期间或在构造函数中赋值。

namespace Test
{
    public class Person
    {
        public readonly int age=20;
        
        public Person()
        {
            age = 15;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            //p1.age = 18;
            Console.WriteLine("年龄:" + p1.age);
            Console.ReadLine();
        }
    }
}

在这里插入图片描述

3、属性(property)

属性是这样的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。
正如上面所说的,在类外部,我们想要访问字段,并不是直接地访问,而是间接的进行访问,属性便是间接访问字段的方式之一。

namespace Test
{
    public class Person
    {
        //字段
        private int age;
        
        //属性
        public int Age
        {
            get { return age; }  //get访问器用于返回属性值
            set { age = value; } //set访问器用于分配新值;value为上下文关键字,用于定义由 set 取值函数分配的值。
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            //p1.age = 18;
            //Console.WriteLine("年龄:" + p1.age);
            p1.Age = 18;
            Console.WriteLine("年龄:" + p1.Age); //输出 18
            Console.ReadLine();
        }
    }
}
namespace Test
{
    public class Person
    {
        //字段
        private int age;
        
        //属性
        public int Age
        {
            get { return age; }  //get访问器用于返回属性值
            set //set访问器用于分配新值;value为上下文关键字,用于定义由 set 取值函数分配的值。
            { 
                if(value>0&&value<130)
                {
                    age = value;
                }
                else
                {
                    throw new Exception("输入年龄无效");
                }
            } 
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Person p1 = new Person();
                //p1.Age = 150;
                p1.Age = 50;
                Console.WriteLine("年龄:"+p1.Age);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }
}

属性可以只有get访问器,这时属性是只读的。

4、方法(method)

“方法”是包含一系列语句的代码块。比如拿Person来说,方法有走路、跑步、唱歌等。Main 方法是每个 C# 应用程序的入口点。
字段可以通过方法间接访问。

namespace Test
{
    public class Person
    {
        private int Age=18;

        public int GetAge()
        {
            return Age;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            Console.WriteLine("年龄:"+p1.GetAge());
            Console.ReadLine();
        }
    }
}

5、事件(event)

类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
举个例子,有3个机器人A、B、C,A可以将自己的消息发送给B,那么此时A就是消息的发布者,B就是消息的订阅者。A也可以将消息发送给B和C,也就是说可以一个发布者对多个订阅者。A和B可以将消息发送给C,也就是说可以多个发布者对一个订阅者。
先写到这里了,我发现事件挺难的,等我学好了再写。

标签:p1,Console,C#,成员,public,Person,int,age,属性
From: https://blog.csdn.net/sc_1313/article/details/141554656

相关文章

  • Docker常用命令大全
    一、docker运行管理类启动dockersystemctlstartdocker关闭dockersystemctlstopdocker重新启动dockersystemctlrestartdockerdocker设置自启动systemctlenabledocker查看docker运行状态systemctlstatusdocker查看docker版本号等信息dock......
  • flutter使用flutter_datetime_picker时导入冲突 'DatePickerTheme' is imported from
    安装flutter_datetime_picker后运行项目出现下面的报错 在ChipsInput小部件中,您使用了两个相互冲突的导入。在调用this.theme=theme??DatePickerTheme()时会发生冲突,因为它不知道使用哪个导入,因为它们具有相同的名称。您需要删除import'package:flutter/src/material/date......
  • MAMP 是一款在 macOS 上搭建本地 Web 开发环境的工具
    MAMP是一款在macOS上搭建本地Web开发环境的工具,包括Apache、MySQL和PHP。以下是MAMP中一些常见的问题及其解决方法:安装问题安装后提示已损坏描述:安装MAMP后提示应用已损坏,无法打开。解决方法:关闭系统完整性保护(SIP)。从可信来源重新下载安装包。使用管理员权......
  • WAMP(Windows + Apache + MySQL + PHP)是在 Windows 系统上搭建本地 Web 开发环境的一种
    WAMP(Windows+Apache+MySQL+PHP)是在Windows系统上搭建本地Web开发环境的一种方式。下面是WAMP中一些常见的问题及其解决方法:启动问题启动后WAMP托盘图标显示橙色描述:WAMP启动后托盘图标显示为橙色,表示某些服务没有正常启动。解决方法:检查Apache或MySQL......
  • XAMPP 是一个非常流行的本地开发环境,用于搭建 PHP、MySQL、Apache 等服务
    XAMPP是一个非常流行的本地开发环境,用于搭建PHP、MySQL、Apache等服务。在使用XAMPP的过程中,可能会遇到各种问题。这里总结了一些常见的问题及其解决方法:安装与配置问题安装失败描述:安装过程中出现错误或安装完成后无法正常启动。解决方法:确保安装过程中没有中断。......
  • [1046] Different permissions in the AWS S3 policy
    Thes3:GetObjectpermissioninanAWSS3policyallowsausertoretrieveobjects(files)fromanS3bucket.Thispermissioniscrucialforreadaccess,enablinguserstodownloadorviewthecontentsoftheobjectsstoredinthebucket123.Here’sanexam......
  • Adobe InCopy(IC)文字处理软件win/mac软件下载安装 系统要求和使用教程
    目录一、AdobeIC软件介绍1.1软件概述1.2软件特点1.3适用范围二、系统要求2.1Windows系统要求2.2macOS系统要求三、安装步骤3.1Windows系统安装步骤3.2macOS系统安装步骤四、使用教程4.1基本操作4.2高级功能4.3注意事项一、AdobeIC软件介绍1.1软......
  • C++ lambda
    文章目录基本语法捕捉列表函数对象与lambda表达式C++的lambda表达式是C++11及以后版本中引入的一种强大的特性,它提供了一种简洁的方式来定义匿名函数对象。Lambda表达式能够捕获其所在作用域中的变量(以值或引用的方式),并允许你在需要函数对象的地方(比如算法库中的函数......
  • 专为动画师、设计师和视频制作者设计 (Adobe CH) win/mac软件安装下载和快捷键的使用
    一、软件概述1.1简介AdobeCharacterAnimator(简称AdobeCH)是一款由AdobeSystems开发的创新软件,专为动画师、设计师和视频制作者设计,能够轻松地将静态图像(如手绘、Photoshop或Illustrator作品)转变为生动的角色,并通过实时动作捕捉技术让这些角色“活”起来。无论是直播......
  • WebGL入门(014):WebGLActiveInfo 简介、使用方法、示例代码
    还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。No.内容链接1Openlayers【入门教程】-......