2010-10-15 117 views
6

一個結構,我有一些代碼來初始化在C#中的結構:如何初始化在C#

namespace Practice 
{ 
    public struct Point 
    { 
     public int _x; 
     public int _y; 

     public int X 
     { 
      get { return _x; } 
      set { _x = value; } 
     } 

     public int Y 
     { 
      get { return _y; } 
      set { _y = value; } 
     } 

     public Point(int x, int y) 
     { 
      _x = x; 
      _y = y; 
     }  
    }  

    class Practice 
    { 
     public static void Main() 
     { 
      Point p1; 
      p1.X = 1; 
      p1.Y = 2; 
     } 
    } 
} 

上面的代碼給出了一個編譯器錯誤:

error CS0165: Use of unassigned local variable 'p1'

爲什麼被拋出這個錯誤?

+1

這實際上是我在C#中的一個寵兒。任何局部變量都應該初始化爲默認的IMO。 – leppie 2010-10-15 14:35:12

回答

23

你不能在一個結構,直到它知道所有的領域已經被填入使用屬性

例如,在你的情況下,這應該編譯:

Point p1; 
p1._x = 1; 
p1._y = 2; 
int x = p1.X; // This is okay, now the fields have been assigned 

注意你如何不要必須在這裏顯式調用構造函數......雖然在封裝良好的結構中,你幾乎總是必須。你可以脫身的唯一原因是你的領域是公開的。伊克。

但是,我強烈建議你而不是無論如何都要使用可變結構。如果你真的想要一個結構,使其不可變和值傳遞到構造函數:

public struct Point 
{ 
    private readonly int x; 
    public int X { get { return x; } } 

    private readonly int y; 
    public int Y { get { return y; } } 

    public Point(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

... 

Point p1 = new Point(1, 2); 
+7

我認爲你的意思是使它不可變。 – Dismissile 2010-10-15 14:26:34

+0

@JonSkeet如果我想'struct'屬性是'可變的',這是否意味着我不應該使用'struct'?即,如果我想在整個過程中爲X和Y設置新的值,該怎麼辦? – Roylee 2014-01-20 06:38:33

+1

@羅伊利:我*不喜歡可變結構 - 其他人不同意。但是它是否應該是一個結構的細節將取決於上下文。 – 2014-01-20 06:45:36

3

你需要創建一個Point第一併將其分配給p1

public static void Main() 
{ 
    Point p1 = new Point(); 
    p1.X = 1; 
    p1.Y = 2; 
} 

順便說一句,你可以有你的結構一個constructor - 可能使事情變得更加容易:

//in Point.cs 
public point (int x, int y) 
{ 
    _x = x; 
    _y = y; 
} 

//in program.cs 
public static void Main() 
{ 
    Point p1 = new Point(1, 2); 
} 

這還允許您避免在結構上保留設置器(保持它不可變)。 。

4

您有Point p1 = new Point();

+1

不,你不知道。查看我的答案,找到一個可以在不使用'new'的情況下編譯和運行的例子。 – 2010-10-15 14:29:58

+0

你是完全正確的。對於一個可變結構體,實際上不需要使用新的結構體,但可變結構體是邪惡的:) – 2010-10-15 14:57:57

0

的statment初始化它:「點P1;」需要一個默認的構造函數。 由於 public Point(int x,int y),所以默認構造函數將不會自動生成。 你需要提供一個默認的構造函數: public Point(){...}

+0

結構體上不允許使用默認構造函數。 – 2015-04-30 17:46:22