2012-11-27 59 views
2

我有一個定義的結構,它包含一個公共字段和一個名爲_one和One的公共屬性,現在我在主函數中實例化結構(不創建新對象),並調用屬性從結構,我得到的編譯時錯誤說使用未分配的局部變量之一,然而,當我打電話給外地_ONE,它的工作原理相當這裏期待我在做什麼:從c#中調用結構屬性#

public struct myStruct 
    { 
     public int _one; 
     public int One 
     { 
      get { return _one; } 
      set { _one = value; } 
     } 
     public void Display() 
     { 
      Console.WriteLine(One); 
     } 
    } 



static void Main(string[] args) 
     { 

      myStruct _struct; 
      _struct.One = 2; // Does not works 
      _struct._one = 2; // Works fine 
     } 

誰能解釋一下什麼原因在這背後,無法理解這個概念。

回答

1

需要初始化的結構,以使財產可訪問 - _struct有一個默認值,否則:

myStruct _struct = new myStruct(); 

順便說一句 - mutable value types are evil

+0

yes我檢查過,當我初始化結構屬性是可訪問的,你能告訴我實際差異是什麼創建,如果沒有初始化它不允許屬性然後爲什麼字段 – Abbas

+0

@Abbas - 因爲值類型不能爲空,當你引用一個時,它會被初始化爲某個東西。這些字段將被初始化爲默認值。對於'int',這將是'0'。 – Oded

0

有利於使用讀寫屬性而不是類定義中的暴露字段的原因不適用於結構,因爲它們既不支持繼承也不支持更新通知,並且結構字段的可變性取決於結構實例,,不管該字段是否暴露。如果一個結構應該表示一組相關但可以自由獨立修改的變量,那麼它應該簡單地將這些變量作爲字段來公開。如果帶有後臺字段的屬性應該是隻讀屬性,構造函數應該直接設置後臺字段,而不是通過屬性設置器。

1

這是不直觀的行爲,但它是由規則允許的明確分配檢查。在C#語言規範的第5.3節中有詳盡的描述。關鍵的短語,本章前面是:

在除了上述規則,下面的規則適用於結構體類型變量及其實例變量:
- 一個實例變量被視爲已明確是否包含其分配struct-type變量被認爲是明確賦值的。
- 如果一個結構類型變量的每個實例變量都被認爲是明確賦值的,則被認爲是明確賦值的。

允許這是後者的規則。換句話說,您也可以通過分配所有變量的來初始化結構。您可以通過嘗試這些片段看到這一點:

myStruct _struct = new myStruct(); 
_struct.Display(); // fine by the 1st bullet 

myStruct _struct; 
_struct.Display(); // bad 

myStruct _struct; 
_struct._one = 2; 
_struct.Display(); // fine by the 2nd bullet 

所以,你不通過分配領域,因爲這將不允許通過賦予其變量初始化結構得到CS0165。