2009-11-30 79 views
3

为什么这个有效如何在结构体的构造函数中设置自动属性?

public struct MyStruct 
{ 
    public MyStruct(double value) 
    { 
     myField = value; 
    } 

    private double myField; 

    public double MyProperty 
    { 
     get 
     { 
      return myField; 
     } 
     set 
     { 
      myField = value; 
     } 
    } 
} 

,这是不是

public struct MyStruct 
{ 
    public MyStruct(double value) 
    { 
     MyProperty = value; 
    } 
    public double MyProperty 
    { 
     get; 
     set; 
    } 
} 
+0

你确定它必须是一个结构而不是一个类吗? – RickNZ 2009-11-30 02:18:05

+0

可能的重复:http://stackoverflow.com/questions/522280/c-how-can-i-set-the-value-of-auto-property-backing-fields-in-a-struct-construc – itowlson 2009-11-30 02:20:51

+0

这是也可能重复poat:http://stackoverflow.com/questions/272153/why-is-it-necessary-to-call-this-on-a-struct-to-use-automatic-properties-in-c – 2009-11-30 02:22:59

回答

3

你需要这个语法:

public struct MyStruct 
{ 
    public MyStruct(double value) : this() 
    { 
     MyProperty = value; 
    } 

    public double MyProperty { get; set; } 
} 

我从following这些信息,以便张贴。

1

你不需要获取设置,如果你不打算让那么做任何事情。他们应该用于类型检查。为了使secound工作删除: {get;组; }

+1

我仍然希望它提供的封装是一个属性。取消get; set;会改变它到一个领域。 – Simon 2009-11-30 02:11:11

+0

@Euclid - 这篇文章解释了为什么在大多数情况下使用属性而不是字段是个好主意:http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx – 2011-11-16 19:39:03

+0

@DanielSchilling:虽然类通常应该公开属性而不是字段,相同的论点不适用于结构。结构不支持继承,并且每个结构的所有字段总是暴露于外部变异(“结构1 =结构2”通过变异结构1的所有字段以匹配结构2的字段,而不访问“结构1”中的任何代码类型)。修改'this'的struct方法,包括属性setter,是古怪的;大部分“可变结构都是邪恶”的说法实际上是“结构属性制定者是邪恶的” - 暴露的领域避免了这些问题。 – supercat 2012-11-27 22:58:59

3

你可以改变你的构造函数是:

public MyStruct(double value) : this() 
{ 
    myField = value; 
} 

的原因是,直到后备字段你不能访问属性已填充。通过调用默认构造函数,自动实现的属性后台字段将被填充,然后您可以访问属性。缺点是你现在设置属性两次(一次在基础构造函数中,一次在构造函数中)。

如果您不需要使用属性并且可以使用字段,那么您可以避免这些问题。

相关问题