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
4

2 に答える 2

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

public void SetSomeMember(int val)
{
    _bar.SomeMember = val; // Note _bar in this example is a field, not a property.
}

これは完全を期すためにのみ提供します。「可変構造体は悪である」というコンセンサスがあるため、不変性のルートをたどります。インターフェイスへのキャストと同様に、プロパティのゲッターは 1 つの落とし穴です。不変の構造体がこれらを解決します。

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

于 2012-04-13T14:05:22.480 に答える
0

変更可能な構造体があるようですが、これはお勧めしません

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

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

ところで:

私が理解しているように、プロパティは参照を返すことができません。

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

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

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

 public IComparable Property { get { return 42; } }
于 2012-04-13T14:06:57.207 に答える