2011-11-07 43 views
0

我只是盯着下面的代碼,並想知道是否真的需要填充12行源代碼。簡單界面與字段的這些選項之間有什麼區別?

private static IUnityContainer _container; 
    public static IUnityContainer Container 
    { 
     get 
     { 
      return _container; 
     } 
     set 
     { 
      _container = value; 
     } 
    } 

我的想法是,爲什麼不只是一個?

public static IUnityContainer Container; 

我想答案是一樣的東西:「你不能破壞封裝」 ..這是更多的是膝跳反應的調理,還是有一些其他的原因,含蓄或以其他方式?

+1

完全一樣。參見[這裏](http://stackoverflow.com/questions/7280502/c-sharp-automatic-properties-are-they-safe-for-enterprise-development/7280544#7280544)瞭解更多信息。 – CodeCaster

+3

這不完全相同。在這裏,他正在談論一個領域VS一個財產,其中有數百個討論可以通過簡單的Google找到。您的鏈接會介紹自動屬性和差異。 –

+1

@CodeCaster它不完全相同。您的鏈接顯示,自動實現的屬性與實現的手動相同,但在這個問題中,它是一個字段和一個屬性。 – DanielB

回答

2

好了,直到你不想使用反射在一些奇怪的方式,喜歡的GetType()的getProperty(「容器」 ......),不存在任何缺點。

然而認爲是不乾淨,以暴露一個字段,屬性通常是從一個純粹點清潔器。

的FxCop會警告你,這是一個不是很好的事情,但目前還沒有缺點。

如果你想很短,但在同一時間乾淨,你可以使用自動屬性:但是

public static IUnityContainer Container { get; set; } 

自動屬性只能因爲編譯器3.0版。

一個可能的缺點是可能發生的是,如果你或其他人傳遞場按地址在某些功能,例如,Interlocked.Exchange(ref MyClass.MyStaticField, null); 如果你在將來的屬性改變它,所以你應該在小心就會不再工作不通過引用傳遞該字段。如果你從一開始就使用一個屬性,你就不會有這個問題。 這個問題不會發生在static readonly字段中,它們不能通過引用傳遞。使用靜態只讀字段非常常見。

其中場絕對不應該被用來替代屬性的情況是,當你有一個繼承的MarshalByRefObject,用於遠程調用(RPC,遠程過程調用)的類。

在這裏,我發佈一個例子,就像我說的,是不是你的情況,因爲這個問題是實例字段,而不是與靜態字段。

public class MyClass : 
    MarshalByRefObject 
{ 
    public int MyValue; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var obj = new MyClass(); 

     // This will give you warning CS1690: Accessing a member on 'MyValue' may cause a runtime exception because it is a field of a marshal-by-reference class 
     Console.WriteLine(obj.MyValue.ToString()); 
    } 
} 

遠程過程調用僅適用於方法和屬性,基於這個原因,編譯器給你一個警告,因爲MarshalByRefObject的可以在室內另一AppDomain中,或被另一個進程或通過TCP/IP的另一臺計算機例如被調用。

+1

你能否詳述一下你對MarshapByReference的評論?我不太明白,也想。感謝您的有用信息。 –

+1

自動屬性與編譯器無關,而與框架無關。您可以定位舊的框架,並在最新的編譯器中仍然使用自動屬性。 –

+0

是的,謝謝:)糾正。 –

0

就我個人而言,我是這樣想的。比方說,稍後,我想建立一個「容器」永不爲空的不變量。如果它被定義爲公共領域,那麼強制執行這個的方法是找出使用它的每個客戶端,並將代碼設置爲防止它被設置爲null。

private static IUnityContainer _container = new ContainerImpl(); 
public static IUnityContainer Container 
{ 
    get 
    { 
     return _container; 
    } 
    set 
    { 
     _container = value ?? _container; 
    } 
} 

或者,你可以扔在空值的例外更有表現:如果我把它作爲一個屬性,同樣可以用下面的方法實現。具體細節並不重要,但封裝角度是。

所以,我認爲這不是簡單的一個下意識的反應,而是一種務實和合理的,特別是在static關鍵字的臉。沒有封裝,這實際上只是一個全局變量。至少封裝全局狀態允許提供者對其進行一些控制,而不是將控制權全部泄露給整個應用程序,並相信/迫使客戶端保持一致。

有人可能把它看作是「不要重複自己」的問題。當涉及到某個領域時,任何常見的邏輯必然會在整個地方複製。

+0

好吧,如果你有一個字段或一個自動屬性,你總是可以隨意更改沒有副作用的代碼,除非你嘗試在某個函數中傳遞字段byref。 –

相關問題