2010-10-15 119 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