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

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,也就是说可以多个发布者对一个订阅者。
先写到这里了,我发现事件挺难的,等我学好了再写。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值