🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 属性 Property 属性是一个比较抽象的概念但是不用担心,因为他一旦被应用到代码之中就会非常的容易理解,但是要解释属性往往还需要理解另一个概念:字段 field ``` class myClass { private int myint;//这是字段 public int Myint//这是属性 { get { return myint; }//get访问器 set { myint = value; }//set访问器 } } ``` 接下来是属性和访问器,属性用于控制字段的访问权限,他的命名只需要符合命名规则即可,控制什么变量则是访问器中规定的,他更像是一个专用的没有参数的方法或者中介,外部的代码通过他访问字段。 > 举个例子: > 你到一个咖啡店购买一个种咖啡,类定义了这是什么咖啡,他能不能放糖; > 接着店员给你把咖啡冲了出来,冲咖啡的这个过程便是实例化,店员根据咖啡类中的配料需求将本来没有的咖啡冲了出来;店员告诉你你可以加入方糖,于是你告诉店员你想加入 2147483647 或者提取 -2147483648 颗方糖出来,就算前者逻辑上可行,但是后者直接违反了质能守恒,这明显是非常荒唐的,这时候属性便能体现出他的用途。 > 现在时间倒退,店员将咖啡给你,并且给你你一个盒子,告诉你里面提供了方糖,这样你能加入的方糖数量就被控制在了范围之内。 > 回到代码中来,属性有两个访问器,一个是**get**访问器,他可以“读”;另一个是**set**访问器,他可以“写”。 get访问器用一个 **return** 来确定获取什么的值或什么值,比如: ``` get { return 10; } ``` 或者: ``` get { return myint; } ``` 他还可以写得更简单一点: ``` get => myint;//“=>”是一个Lambda箭头,这里不详细介绍 ``` set访问器用一个 value 来获取接收到的值,并赋值给操作目标比如: ``` set { myint = value; } ``` 你也可以不使用value关键字 ``` set { myint = 10; } ``` 但是这样写,不管你对属性输入什么,属性所操作的变量的值都只会是10,因为set访问器获取的值是用 **value** 关键字表示的。 你还可以在访问器中增加更多代码: ``` class myClass { private int myint;//这是字段 public int Myint//这是属性 { get { if (myint >= 0 && myint <= 10) return myint; else { return 0; Console.WriteLine("获取数值错误"); } } set { if (value >= 0 && value <= 10) myint = value; else Console.WriteLine("数值不符合规定!"); } } } ``` 这里要注意的是get访问器所有执行路线都必须要有一个**return**关键字返回值,且返回值类型要和属性类型相同,否则会报错。 定义属性可以只使用其中任意一个访问器,还可以给访问器加上访问修饰符。 ``` public int Myint//只能获取myint的值而不能修改他 { get { return myint; } } //和 public int Myint//类的外部可以获取myint的值,但是想要修改myint的值就只能在类的内部 { get { return myint; }//类外部代码可以访问这个访问器 private set { myint = value; }//只有类能访问这个访问器 } ``` 上面的代码要注意不能给get也加上**private**关键字,因为这样做的话外面的代码仍然可以访问到属性,但是无法对属性进行任何操作,这样将会产生一个错误,如果属性只提供给类访问的话可以直接把属性整体的访问修饰符修改成**private**。 如何使用访问器: 上文中声明属性的代码可能有点复杂,但是不必担心这个问题,因为使用属性的方法和变量几乎没有任何区别: ``` /*这里的代码使用了文章开头的代码定义``*/ static void Main(string[] args) { int a; myClass myObj = new myClass();//实例化 myObj.Myint = 7;//自动使用了set访问器 a = myObj.Myint;//自动使用了set访问器 Console.WriteLine($"从get获取到了{myObj.Myint}"); Console.ReadKey(); } ``` 执行结果为: ``` 从get获取到了7 ``` 可以看到使用属性时,只需要把他当成一个变量即可,他与变量不同的地方只是他能更灵活的控制接收什么样的变量,接收到什么样的变量时该做什么。