首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 銳利體驗 (七) (2):屬性設計模式與存取子分離陷阱

     編輯:關於C語言

屬性:C# 語言創新

屬性背後實現為兩個函式(get 取值、set 指派),從中介語言代碼清晰可見。但確在語言層面實現面向物件一直訴求的「屬性」特殊介面。C# 不提倡將欄位設 public 任意操作——太不安全!對所有需在類別外可見的欄位,建議用屬性表達。屬性不代表儲存位置,這是與欄位根本差異。

典型屬性設計

class MyClass
{
    int integer;
    public int Integer
    {
        get { return integer; }
        set { integer = value; }
    }
}
class Test
{
    public static void Main()
    {
        MyClass obj = new MyClass();
        Console.Write(obj.Integer); // 0
        obj.Integer++;
        Console.Write(obj.Integer); // 1
    }
}

value 為 C# 關鍵字,為 set 隱含參數(指派操作右值)。

三種存取介面與分離陷阱

屬性提供唯讀(get)、唯寫(set)、讀寫(get+set)三種介面。對欄位這三種操作,必須在同一屬性名下宣告,不可分離:

// 錯誤寫法:分離 Name 屬性
class MyClass
{
    private string name;
    public string Name { get { return name; } }
    public string Name { set { name = value; } } // 編譯錯誤!
}

繼承中存取子分離會被隱藏

class MyClass
{
    protected int num = 0;
    public int Num { set { num = value; } } // 唯寫
}
class MyClassDerived : MyClass
{
    new public int Num { get { return num; } } // 唯讀,隱藏基類 Num
}
class Test
{
    public static void Main()
    {
        MyClassDerived obj = new MyClassDerived();
        // obj.Num = 1; // 錯誤!Derived 隱藏了基類 set
        ((MyClass)obj).Num = 1; // 必須轉型呼叫基類 set
    }
}

C# 視三種屬性為同一屬性名,MyClassDerived 中 Num 的 get 隱藏了 MyClass 中 Num 的 set。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved