簡體   English   中英

在Unity中使用Getters和Setter

[英]Using Getters and Setters in Unity

我對getter和setter有另一個問題。 現在我開始使用c#getters和setter,因為我理解它們。 我看到的問題是為什么我應該創建如下所示的公共變量:

// Variable
private int _iRandomNumber
// Getter and setter
public int iRandomNumber
{
     get { return _iRandomNumber; }
     set { _iRandomNumber = value; }

}

我沒有看到這一點,因為只是將變量設為公開會有什么不同,因為無論如何得到get並設置在同一個括號中?

但是,如果我喜歡這樣:

// Variable
private int _iRandomNumber
// Getter and setter
public int GetiRandomNumber { get { return _iRandomNumber; } }
public int SetiRandomNumber { set { _iRandomNumber = value; } }

然后,當我嘗試單獨使用我的SetiRandomNumber時,Unity編譯器會抱怨我無法使用我的SetProperty,因為我的SET中沒有GET屬性。 我是否真的必須像我寫的第一個例子一樣,因為在我寫的時候,c#中的Getters和Setters有什么意義?

或者我應該轉而離開它們,就像我從一開始就問過並為c ++中的每個Get和Set創建函數所以我實際上可以自己使用它們?

很抱歉讓這個問題成為一個新問題,但是由於很長時間以來無法將此作為評論添加到我之前的問題中。

屬性允許您在設置值時觸發事件,例如:

public string Name {
    get { return name; }
    set {
        name = value;
        var eh = NameChanged;   // avoid race condition.
        if (eh != null)
            eh(this, EventArgs.Empty);
    }
}
private string name;
public event EventHandler NameChanged;

另外一個好處是,您可以通過調試器或診斷打印語句在getter / setter中放置斷點來跟蹤何時設置或讀取屬性。

我沒有看到這一點,因為只是將變量設為公開會有什么不同,因為無論如何得到get並設置在同一個括號中?

不同之處在於您將實現細節 (字段)與API (屬性)分開。 您可以稍后更改實現,例如使用一個long變量來提供兩個int字段。 (這只是一個隨機的例子。)或者你可以在setter中提供驗證和更改通知。 或者您可以在getter中執行延遲計算。 或者您可以從外部將屬性設置為只讀,但可以私下寫入。 名單還在繼續。

您的第二個代碼聲明了兩個不同的屬性 - 一個是只讀的,一個是只寫的,都由同一個變量支持。 至少可以說這是非慣用的C#,沒有任何好處。 這兩個屬性之間沒有聯系,而在第一個版本中,getter和setter之間存在明確的聯系,因為它們是同一屬性的一部分。

需要注意的一點是,您的第一個示例可以使用自動實現的屬性更簡潔地表達:

// Removed unconventional "i" prefix; this follows .NET naming conventions.
public int RandomNumber { get; set; }

這會在幕后創建一個私有變量,以及一個getter和setter只使用私有變量的公共屬性。 稍后如果要更改實現,可以在不影響API的情況下執行此操作。

getter和setter的優點是它們主要充當函數,因此你可以做這樣的事情

private int _iRandomNumber;

public int iRandomNumber
{
     get { return _iRandomNumber%10;} //you can do something like this mod function 
     set { _iRandomNumber = value+1000;} //you can manipulate the value being set 

} 

但是如果你對變量沒有這種要求,你也可以只使用一個公共變量。

暫無
暫無

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

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