2 自动属性 但是呢

时间:2022-03-07 02:06:38

这得先隶属性开始说,为什么外部代码访谒东西内部的数据用属性而不是直接访谒呢,这样岂不是更便利一些,但是事实证明直接访谒是不安适的。那么,Anders Hejlsberg(安德斯·海尔斯伯格)就为C#插手了属性这种语法糖,用起来跟数据成员一样,但实际上是 setXX()getXX(),既安适又便利。

属性:是访谒东西的首选方法,因为它们禁止外部代码访谒东西内部的数据存储机制的实现。

public int MyIntProp { get { //property get code } set { //Proerty set code } }

1.1 get关键字

get块必需有一个属性的返回值,简单的属性一般与私有字段相关联,以控制对这个字段的访谒,此时get块可以直接返回该字段的值,例如:

private int myInt; public int myIntProp {   get   {     return myInt;   }   set   {     //Property set code.   } }

类外部的代码不能直接访谒这个myInt字段,私有的,必需使用属性来访谒该字段。

1.2 set关键字

set函数以类似的要领把一个值赋给字段。这里使用value暗示用户供给的属性值:

private int myInt; public int myIntProp {   get   {     return myInt;   }   set   {     myInt = value;   } }

value即是类似与属性不异的值,所以如果属性和字段使用不异的类型,就不必担忧数据类型转换了。

这个简单的属性只能直接访谒myInt字段。在对操纵进行更多的控制的时候,属性的真正感化才华阐扬出来,例如,使用下面的代码实现set块: 

set {   if(value >= 0 && value <= 10)   myInt = value; }

只用赋给属性的值在1~10之间,才会改myInt。此时,要做一个重要的设计选择:如果使用了无效值,该怎么办:

什么也不做

给字段赋默认值

继续执行,就仿佛没有产生错误一样,但记录下来该事件,以备将来分析

抛出异常

一般情况下,后面两个选择效果较好,选择哪个选项取决于如何使用类,以及给用户授予几多控制权。抛出异常给用户供给的控制权相当的大,例如:

set {   if(value >= 0 && value <= 10)     myInt = value;   else     throw (new ArgumentOutOfRangeException("myIntProp",value,"myIntProp must be assigned a value between 0 and 10.")) }

这可以在使用属性的代码中通过try...catch...finaly逻辑来措置惩罚惩罚。

注:属性可以使用virtualoverrideabstract关键字,就像要领一样,但这几个关键字不能用于字段。最后,如上述,访谒器可以有本身的访谒性。

实例: 

public class MyClass { public readonly string Name; private int intVal; public int Val {   get   {   return intVal;   }   set   {     if (value >= 0 && value <= 10 )       intVal = value;     else       throw (new ArgumentOutOfRangeException("Val",value,"Val must be assigned a value between 0 ang 10."));   } } public override string ToString() {   return "Name:"+Name+"\nVal:"+Val; } private MyClass(): this("Default Name") { } public MyClass(string newName) {   Name = newName;   intVal = 0; } } static void Main(string[] args) {   Console.WriteLine("Creating object myobj...");   MyClass myObj = new MyClass("My Object");   Console.WriteLine("myObj created.");   for (int i = -1; i <= 0; i++ )   {     try     {       Console.WriteLine("\nAttempting to assign {0} to myObj.val...",i);       myObj.Val = i;       Console.WriteLine("Value {0} assigned to myObj.val.", myObj.Val);     }     catch(Exception e)     {       Console.WriteLine("Exception {0} throw.",e.GetType().FullName);       Console.WriteLine("Message:\n\"{0}\"",e.Message);     }   }   Console.WriteLine("\nOutputting myObj.ToString()...");   Console.WriteLine(myObj.ToString());   Console.WriteLine("myObj.ToString() Output.");   Console.ReadKey(); }