經典講解C# get set
作者: tiantianne 來源: 51cto 發布時間: 2009-10-30 17:39 閱讀: 141426 次 推薦: 31 [收藏]
C# get set函數很常用,但是用好還是需要很多經驗的,下面的文章就是幫你積累C# get set函數經驗的。
C# get set不提倡將域的保護級別設為 public而使用戶在類外任意操作--那樣太不OO,或者具體點說太不安全!對所有有必要在類外可見的域,C#推薦采用屬性來表達。屬性不表示存儲位置,這是屬性和域的根本性的區別。下面是一個典型的屬性設計:
using System; class MyClass { int integer; public int Integer { get {return integer;} set {integer=value;} } } class Test { public static void Main() { MyClass MyObject=new MyClass(); Console.Write(MyObject.Integer); MyObject.Integer++; Console.Write(MyObject.Integer); } }
一如我們期待的那樣,程序輸出0 1。我們可以看到屬性通過對方法的包裝向程序員提供了一個友好的域成員的存取界面。這里的value是C# get set的關鍵字,是我們進行屬性操作時的set的隱含參數,也就是我們在執行屬性寫操作時的右值。
屬性提供了只讀(get),只寫(set),讀寫(get和 set)三種接口操作。對域的這三種操作,我們必須在同一個屬性名下聲明,而不可以將它們分離,看下面的實現:
class MyClass { private string name; public string Name { get { return name; } } public string Name { set { name = value; } } }
上面這種分離Name屬性實現的方法是錯誤的!我們應該像前面的例子一樣將他們放在一起。值得注意的是三種屬性(只讀,只寫,讀寫)被C# get set認為是同一個屬性名,看下面的例子:
class MyClass { protected int num=0; public int Num { set { num=value; } } } class MyClassDerived: MyClass { new public int Num { get { return num; } } } class Test { public static void Main() { MyClassDerived MyObject = new MyClassDerived(); //MyObject.Num= 1; //錯誤 ! ((MyClass)MyObject).Num = 1; } }
abstract class A { int y; public virtual int X { get { return 0; } } public virtual int Y { get { return y; } set { y = value; } } public abstract int Z { get; set; } } class B: A { int z; public override int X { get { return base.X + 1; } } public override int Y { set { base.Y = value < 0? 0: value; } } public override int Z { get { return z; } set { z = value; } } }
這個例子集中地展示了屬性在繼承上下文中的某些典型行為。這里,類A由于抽象屬性Z的存在而必須聲明為abstract。子類B中通過base關鍵字來引用父類A的屬性。類B中可以只通過Y-set便覆蓋了類A中的虛屬性。
靜態屬性和靜態方法一樣只能存取類的靜態域變量。我們也可以像做外部方法那樣,聲明外部屬性。以上就是對C# get set的簡單介紹。
31
5
全站熱搜