經典講解C# get set



轉自:http://kb.cnblogs.com/page/50502/

   

  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;
    }
}  
由於屬性的方法的本質,屬性當然也有方法的種種修飾。屬性也有5種存取修飾符,但屬性的存取修飾往往爲public,否則我們也就失去了屬性作爲類的公共接口的意義。除了方法的多參數帶來的方法重載等特性屬性不具備外, virtual, sealed, override, abstract等修飾符對屬性與方法同樣的行爲,但由於屬性在本質上被實現爲兩個方法,它的某些行爲需要我們注意。看下面的例子:

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的簡單介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章