这得先隶属性开始说,为什么外部代码访谒东西内部的数据用属性而不是直接访谒呢,这样岂不是更便利一些,但是事实证明直接访谒是不安适的。那么,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逻辑来措置惩罚惩罚。
注:属性可以使用virtual、override和abstract关键字,就像要领一样,但这几个关键字不能用于字段。最后,如上述,访谒器可以有本身的访谒性。
实例:
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(); }