2013-09-27 64 views
0

超簡單的問題...如何正確初始化結構上的私有後臺字段?我得到一個編譯器錯誤:如何使用編譯器生成的後臺字段初始化結構

Backing field for automatically implemented property 'Rectangle.Y' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

繼承人的源代碼。

public struct Rectangle 
{  
    public Rectangle(int x, int y, int width, int height) 
    { 
     X = x; 
     Y = y; 
     Width = width; 
     Height = height; 
    } 
    public int Width { get; private set; } 
    public int Height { get; private set; } 
    public int X { get; private set; } 
    public int Y { get; private set; } 
} 
+0

你何時何地得到錯誤? –

回答

4

這是一個在結構中使用自動實現的屬性的問題。你需要明確鏈參數的構造函數:

public Rectangle(int x, int y, int width, int height) : this() 
{ 
    X = x; 
    Y = y; 
    Width = width; 
    Height = height; 
} 

編譯器不「認識」,設置每個屬性將設置相關的領域 - 它需要看到所有的字段(你可以」因爲它們是自動生成的,所以明確地訪問)被分配。幸運的是,無參數構造函數爲你做到了。

個人而言,我只希望用真實的只讀域和手動屬性,而不是,你要知道:

public struct Rectangle 
{  
    private readonly int x, y, width, height; 

    public int X { get { return x; } } 
    public int Y { get { return y; } } 
    public int Width { get { return width; } } 
    public int Height{ get { return height; } } 

    public Rectangle(int x, int y, int width, int height) 
    { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 
} 

我希望C#有宣稱「真正的」只讀自動實現的屬性,的方式使得制定者只可能在構造函數中被調用,並且將被直接轉換爲寫入只讀字段,但沒關係...

1

如果您鏈式調用默認構造函數(它將默認爲您初始化後備字段,以滿足編譯器)你可以避免這個錯誤。

public Rectangle(int x, int y, int width, int height) 
    : this() 
{ 
    // ... 
0

除非你有使用autoproperties而不是場特別的原因,簡單地使用公共字段。類屬性可以做到字段不能的有用的東西(例如,支持更新通知),並且在類類型中使用自動屬性以開始(而不是字段)將使得稍後如果這種額外的特徵變得必要時更容易使用真實屬性。可變結構屬性並不真正提供與類屬性相關的任何優點。鑑於聲明:

SomeStructure foo,bar; 
... 
foo = bar; 

的最後一條語句將捕獲所有bar的國家的公共和私人領域,並與所有foo的那些內容覆蓋的公共和私人領域,不伴有任何代碼與SomeStructure有任何權力來阻止它,甚至知道它已經發生。如果結構的語義是成員可以擁有對其各自類型有效的值的任意組合,那麼使用屬性而不是字段會使某些操作不太方便(例如初始化),同時提供基本上沒有保護或其他優點可以說。