簡體   English   中英

C#類成員訪問

[英]C# class members access

C#類數據成員(字段或屬性)可以是私有的,也可以是公共的或受保護的。

如果我想讓成員方法僅使用一個私有字段而不暴露給外界怎么辦?

我可以繼續使用私有字段,而無需破壞封裝或其他任何功能?

我不理解的是兩個概念:我們可能需要暴露給外界的數據與我們不需要這樣做的數據(在類的外圍)。

在談論建立課程時,這兩種數據是什么?

在下面的示例中,私有字段“名稱”是該類的私有字段,但仍可通過外部世界獲取/設置。 那么,這里的抽象是不是“不像'這里就這么簡單'那樣直接公開”,而是要添加一種間接的訪問或更新機制? 當我們談論公共領域與公共財產時,我們所說的是封裝嗎?

class Employee2
{
    private string name = "Harry Potter";
    private double salary = 100.0;

    public string GetName()
    {
        return name;
    }

    public void SetName(string title, string fullName)
    {
       this.name = title + fullName;        
    }

    public double Salary
    {
        get { return salary; }
    }
}

class PrivateTest
{
    static void Main()
    {
        Employee2 e = new Employee2();

        // The data members are inaccessible (private), so 
        // they can't be accessed like this: 
        //    string n = e.name; 
        //    double s = e.salary; 

        // 'name' is indirectly accessed via method: 
        string n = e.GetName();

        // 'salary' is indirectly accessed via property 
        double s = e.Salary;
    }
}

通過使用protected關鍵字,您可以限制一個屬性或方法在聲明它的類內以及從聲明此成員的類派生的任何類內可訪問。 (MSDN)

class Employee2
{
    private string name = "Harry Potter";
    private double salary = 100.0;

    protected string GetName()
    {
        return name;
    }

    protected string SetName(string newName)
    {
        this.name = newName;
    }

    protected double Salary
    {
        get { return salary; }

    }
}

如果您問何時可以將實際字段公開,那么使用公共獲取/設置訪問器有什么意義,這是因為這樣您便可以在以后更改該字段的類的私有實現,而無需更改客戶端代碼。 例如,您可以添加一個檢查,以確定設置器是否獲得了有效的輸入,甚至可以完全更改私有字段的數據類型,但可以在設置器中正確轉換它。

編輯:

評論中提到的SetName()是一個奇怪的添加。 它實際上應該更改名稱(並帶有參數),而不返回字符串。

封裝意味着對象的內部表示通常在對象定義之外的視圖中不可見。 通常,只有對象自己的方法才能直接檢查或操縱其字段

       private decimal accountBalance = 500.00m;

       public decimal CheckBalance() 
          {
            return accountBalance;
          }

以及get和set對於觸發對象成員的值更改事件很有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM