更新1
看起來好像我的英語非常糟糕,或者人們只是不給一個...瞭解我在問什麼,或者只是看看帖子的標題。爲什麼不顯式初始化只讀自動實現屬性在c#6中有效?
C#5 specification明確規定:
Because the backing field is inaccessible, it can be read and written only through the property accessors, even within the containing type. This means that automatically implemented read-only or write-only properties do not make sense, and are disallowed.
public string MyProperty {get;}
有沒有意義,但它的成本沒有爲編譯器產生的吸氣甚至沒有交戰約缺少二傳手。備份字段將使用默認值進行初始化。這是什麼意思?這意味着設計人員花費了一些努力來實施驗證,以引入可以省略的功能。
現在考慮C#6:
在C#6自動實現屬性的初始化是introduced。
public string FirstName { get; set; } = "Jane";
或
public string FirstName { get; } = "Jane";
在後一種情況下,屬性可以在構造函數中設置,以及:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
}
public Program()
{
ImagePath = "";
}
}
但只有在被宣佈屬性的類的構造函數。派生類不能設置屬性的值。
現在問自己這是什麼性質意味着,如果它不是在構造函數初始化:
property string My {get;}
這相當於C#5禁止財產的100%。它沒有任何意義。
但是在C#5中無效的聲明在C#6中變得有效。但是語義完全沒有改變:這個屬性在沒有顯式初始化的情況下是無用的。
這就是爲什麼我問:
爲什麼沒有初始化只讀自動實現的屬性是在C#6有效嗎?
我希望看到作爲一個答案是什麼:
-
我最初設想
- 無論揭穿約在C#中的變化6
- 或解釋如何以及爲什麼編譯器設計人員改變他們的想法 什麼有道理,什麼都沒有。
我發現答案0是完全不相關的。這只是一個事實。我尋找原因。我不相信編譯器設計者只是拋硬幣就決定編譯器行爲的改變。
這是一個很好的答案example。
原來的問題
在VS2015該代碼被編譯沒有錯誤:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
Console.WriteLine("Hello World");
}
}
然而,在VS2013我得到錯誤:
Compilation error (line 5, col 28): 'Program.ImagePath.get' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.
我知道關於initiali zable自動實現的屬性,並在VS2015字段獲取默認值,即null
這裏。但是,有趣的是,要知道爲什麼此片段在C#5中無效?
Initializable自動實現readonly
財產留給沒有明確的初始化我看來有點奇怪。這可能是一個錯誤,而不是意圖。我個人比較喜歡的編譯器需要顯式初始化在這種情況下:
public string ImagePath { get; } = default(string);
好吧,我知道這樣的屬性也被分配在構造函數:
public class Program
{
public string ImagePath { get; }
public static void Main()
{
}
public Program()
{
ImagePath = "";
DoIt();
}
public void DoIt()
{
//ImagePath = "do it";
}
}
public class My : Program
{
public My()
{
//ImagePath = "asdasd";
}
}
但是,如果編譯器檢查局部變量未初始化,屬性也可能相同。
那麼,爲什麼是它,因爲它是什麼?
爲什麼不問問編譯器爲什麼允許非初始化只讀字段?情況完全一樣。 – Evk
@Evk如果這種行爲改變了,我會問。 –
只讀屬性是一項新功能,因此沒有任何行爲改變。我的意思是「這可能是一個錯誤,而不是意圖,我個人更喜歡編譯器在這種情況下需要顯式初始化」 - 對於只讀字段也是如此。 – Evk