經(jīng)典講解C# get set
C# get set函數(shù)很常用,但是用好還是需要很多經(jīng)驗(yàn)的,下面的文章就是幫你積累C# get set函數(shù)經(jīng)驗(yàn)的。
C# get set不提倡將域的保護(hù)級(jí)別設(shè)為 public而使用戶在類外任意操作--那樣太不OO,或者具體點(diǎn)說太不安全!對所有有必要在類外可見的域,C#推薦采用屬性來表達(dá)。屬性不表示存儲(chǔ)位置,這是屬性和域的根本性的區(qū)別。下面是一個(gè)典型的屬性設(shè)計(jì):
- 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。我們可以看到屬性通過對方法的包裝向程序員提供了一個(gè)友好的域成員的存取界面。這里的value是C# get set的關(guān)鍵字,是我們進(jìn)行屬性操作時(shí)的set的隱含參數(shù),也就是我們在執(zhí)行屬性寫操作時(shí)的右值。
屬性提供了只讀(get),只寫(set),讀寫(get和 set)三種接口操作。對域的這三種操作,我們必須在同一個(gè)屬性名下聲明,而不可以將它們分離,看下面的實(shí)現(xiàn):
- class MyClass
- {
- private string name;
- public string Name
- {
- get { return name; }
- }
- public string Name
- {
- set { name = value; }
- }
- }
上面這種分離Name屬性實(shí)現(xiàn)的方法是錯(cuò)誤的!我們應(yīng)該像前面的例子一樣將他們放在一起。值得注意的是三種屬性(只讀,只寫,讀寫)被C# get set認(rèn)為是同一個(gè)屬性名,看下面的例子:
- 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; //錯(cuò)誤 !
- ((MyClass)MyObject).Num = 1;
- }
- }
我們可以看到MyClassDerived中的屬性Num-get{}屏蔽了MyClass中屬性Num-set{}的定義。
當(dāng)然屬性遠(yuǎn)遠(yuǎn)不止僅僅限于域的接口操作,屬性的本質(zhì)還是方法,我們可以根據(jù)程序邏輯在屬性的提取或賦值時(shí)進(jìn)行某些檢查,警告等額外操作,看下面的例子:
- class MyClass
- {
- private string name;
- public string Name
- {
- get { return name; }
- set
- {
- if (value==null)
- name="Microsoft";
- else
- name=value;
- }
- }
- }
由于屬性的方法的本質(zhì),屬性當(dāng)然也有方法的種種修飾。屬性也有5種存取修飾符,但屬性的存取修飾往往為public,否則我們也就失去了屬性作為類的公共接口的意義。除了方法的多參數(shù)帶來的方法重載等特性屬性不具備外, virtual, sealed, override, abstract等修飾符對屬性與方法同樣的行為,但由于屬性在本質(zhì)上被實(shí)現(xiàn)為兩個(gè)方法,它的某些行為需要我們注意。看下面的例子:
- 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; }
- }
- }
這個(gè)例子集中地展示了屬性在繼承上下文中的某些典型行為。這里,類A由于抽象屬性Z的存在而必須聲明為abstract。子類B中通過base關(guān)鍵字來引用父類A的屬性。類B中可以只通過Y-set便覆蓋了類A中的虛屬性。
靜態(tài)屬性和靜態(tài)方法一樣只能存取類的靜態(tài)域變量。我們也可以像做外部方法那樣,聲明外部屬性。以上就是對C# get set的簡單介紹。
【編輯推薦】