2012-10-04 28 views
10

也許這是一個愚蠢的問題,但是,我對C#的新手很合理(更多來自Java背景),並且在我看到的有關屬性的getter和setter的不同示例之間感到困惑。使用支持變量獲取和設置器

在某些情況下,代碼如下所示:

private string _something; 
    public string Something 
    { 
     get { return _something; } 
     set { _something = value; } 
    } 

然而,在其他的例子,他們不使用此後盾memeber,所以它更像是這樣的:

public string Something { get; set; } 

我不真正看到使用這些支持變量(_something)的好處,除非你有一些關於變量設置的複雜邏輯。

我正在使用後一種方法編寫我的程序,但想檢查我沒有遺漏任何東西。

有人可以請解釋爲什麼人們選擇做前者?這是更好的做法嗎?

非常感謝!

+0

我想後一個是原型定義,就像java中的'interface'。 –

+0

@SuzanCioc Nope。它是一樣的 - 但支持字段是由C#編譯器爲您實現的。 –

+0

啊不,我錯了。這是具有隱式後備變量的新語法。 –

回答

8

我真的沒有看到使用這些支持變量(_something)的好處,除非你有一些關於變量設置的複雜邏輯。

如果您不使用它,沒有優勢。採用第二種方法時,仍然有一個後備變量,但是你讓編譯器做了添加它的工作。從.NET 3.5及更高版本開始,您當前的方法完全有效。

當然,只要您需要引入額外的邏輯,您自己管理後備存儲變得至關重要。

+0

那麼編譯器是否會增加開銷? – Riana

+1

@AngelBrighteyes不 - 這和你自己寫的完全一樣。這只是少打字。 (和一個不同的,編譯器生成的字段名稱) –

+3

@AngelBrighteyes - 這只是所謂的「語法糖」的一個例子。較短的代碼,但在幕後操作方式完全相同。 –

5

以前的語法在.NET 3.5之前是必需的,因此可以在舊代碼中找到。

它在功能上等同。

+0

完美,感謝您的快速回復! – rioubenson

2

public string Something {get;組; } 只是簡短的。在後臺它正在做與上面完全相同的事情。

1

使用第一種語法的一個很好的理由是用於MVVM體系結構,其中您的屬性綁定到前端元素。

喜歡的東西:

private string _something; 
    public string Something 
    { 
     get { return _something; } 
     set { 
       _something = value; 
       OnNotifyPropertyChanged("Something"); 
      } 
    } 

這將其綁定屬性已經改變,它有更新提醒您的前端。

+0

啊,這也許正是我所看到的。我正在嘗試使用MVVC體系結構構建我的應用程序,因此已經使用了大量教程來掌握它。我懷疑這是我混淆的地方。謝謝。 – rioubenson

0

引用從內您的實例是一樣的聲明公共領域,它打破了Encapsulation Principle自動屬性。因此,如果不在相同的類中訪問它們,請使用自動屬性。否則,使用成員(支持)字段,並通過本地方法引用它,同時通過普通的.NET屬性公開它們。

自動屬性被添加到.NET 3中。0作爲語法糖,所以你不再需要在你的類中沒有引用的支持字段。

相關問題