2009-11-30 56 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; 
} 

的原因是,直到後備字段你不能訪問屬性已填充。通過調用默認構造函數,自動實現的屬性後臺字段將被填充,然後您可以訪問屬性。缺點是你現在設置屬性兩次(一次在基礎構造函數中,一次在構造函數中)。

如果您不需要使用屬性並且可以使用字段,那麼您可以避免這些問題。

相關問題