2012-04-13 8 views
4

私はそれを理解し、プロパティが参照を返すことができず、構造体は値型なので、可能にするプロパティを介して構造体への参照を返す方法はありません。構造体への参照のプロパティ構文を有効にしますか?

public struct SomeStruct 
{ 
    public int SomeMember { get; set; } 
} 
class foo 
{ 
    private SomeStruct bar; 
    public SomeStruct Bar{ get { return bar; } set { bar = value; } } 
} 

//Somewhere else 
foo f = new foo(); 
f.Bar.SomeMember = 42; //Error, this doesn't work 

私はに頼る必要がありますsetMemberOfSomeStruct()または別の方法がありますか?

編集:特に、私はこれらのような構造体に対して常にnewを呼び出す必要はありません。私は、コンストラクタSomeStruct(int型)で、これがうまくいくことを知っている:

f.Bar = new SomeStruct(42); //ugh 
+0

変更可能な構造体は悪いので使用しないでください。不変の構造体を使用します。 – Servy

+0

奇妙な。この悪いデザインはXNAでですか?これは4 intを持つstruct Rectangleを持っています。私は4つのintのうち2つだけを頻繁に更新する必要があります。これを行うたびに新しい四角形を作成する必要が本当にありますか? – TravisG

+0

はい。新しい構造体を作成するのは高価な操作ではなく、非常に安価です。それが最初の場所で構造体を使用する理由のすべてです。 – Servy

答えて

2

があなたのstruct実装不変を作成し、次の操作を行います。

var newSomeStruct = new SomeStruct(42 /* Feeds SomeMember */); 
var myFoo = new Foo(); 
myFoo.Bar = newSomeStruct; 

public struct SomeStruct 
{ 
    private int _someMember; 

    public int SomeMember { get { return _someMember; } } 

    public SomeStruct(int someMember) 
    { 
     _someMember = someMember; 
    } 
} 

不変の構造体は値型のセマンティクスを維持する助けそれは期待される。

不変にしないと、上記のコードはこれを動作させる唯一の方法です。また

が、非常に良く見ていない、SomeStructのクラスのコピーを設定するには、クラスにメソッドを公開:私は完全を期すためにこれを提供

​​

、私はまだのように不変のルートを下るだろう「変化する構造体は悪い」というコンセンサスがあります。 Property gettersはインタフェースにキャストするものと同じく、不変の構造体がこれらを解決します。

また、パフォーマンスの問題が実際に存在する前にパフォーマンスの問題が存在すると想定しないでください。 classの定義は、あなたがそれから得たスタイルのためのstructと同じくらい速いかもしれません。プロファイリングはここで王様です。

+0

申し訳ありませんが、少し速かったです。私の編集を参照してください:) – TravisG

0

変更可能な構造体のようです。which isn't recommended

しかし、あなたの質問に直接答えるには、コピーを作成し、それを突然変異させ、突然変異した構造体でプロパティを設定します。ところで

var barCopy = f.Bar; 
barCopy.SomeMember = 42; 
f.Bar = barCopy; 

私の理解では、プロパティが参照を返すことはできません。

もちろん、参照型のプロパティはゲッターからの参照を返します。

構造体は値型であるため、プロパティを介して構造体への参照を返す方法はありません。

確かに、ボックス化された構造体への参照を返すことができます。例:

public IComparable Property { get { return 42; } } 
+0

箱入りの 'struct'はまだコピーではありませんか? http://blogs.msdn.com/b/abhinaba/archive/2005/10/05/477238.aspx –

+0

@Adam:何のコピー?私が提供した例では、毎回箱が表示されます(その意味ではコピーです)。ただし、もちろん箱の中では一度その箱への安定した参照を保持することができます。 – Ani

+0

本当ですが、それはOPの要件には無意味です。参照を返すことに関する彼のコメントについては、値の型への参照を返すことに言及していたと思います。 –

関連する問題