2

これは主に構文に関する質問です。これは、同じ結果を達成するためのさまざまな代替手段を示す関連スレッドです: C# でのメソッドチェーン

現在、C++ では、メソッドがメンバであるオブジェクトへのポインタをメソッドが返すようにすることで、オブジェクトにコマンドを連鎖させることができます。

私が探している構文は次のとおりです。

foo.Transform(bar).TransformDifferently(yay);

C#では、これを返すと、値がコピーされます(編集:半分間違っており、回答を読んでください)。参照またはポインターを返すことができないと思いますか? 同じ構文を実現する他の方法はありますか?

今のところ、私の解決策は、次のように結果をオブジェクトに割り当てることです。

foo = foo.Transform(bar).TransformDifferently(yay);

ただし、これは最適な解決策ではありません。これは、遅くなり (私の場合は問題になりません)、冗長になるためです。正しい方向への指針があればとてもうれしいです!

4

3 に答える 3

1

C# では、これを返すと値がコピーされます

これは、少なくともクラスには当てはまりません。C# のクラスは参照型です。つまり、その型のすべての変数は実際には参照であるため、現在のインスタンスへの参照をthis返すだけです。

したがって、これを行うには、C# でも基本的に同じです。

public class Foo
{
    public Foo Transform(Bar bar)
    {
        // transform
        return this;
    }

    public Foo TransformDifferently(Yay yay)
    {
        // transform
        return this;
    }
}

値型の場合、その型の新しいインスタンスを返す必要があります。値の型は不変であると想定されているため、正しく設計されていればstruct、元の型を変更するメソッドは存在しないはずです。Transform代わりに、構造体の新しいバージョンを変更する必要があります。

于 2013-07-16T11:19:37.210 に答える
0

foo 変数の型は何ですか? それはクラスですか、それとも構造体のインスタンスですか?

クラス インスタンスの場合は、'this' を返すことで、探している構文を実現できます。オブジェクトはコピーされません。'this' は、ご想像のとおりの参照です。

foo が構造体インスタンスの場合、達成しようとしているのは悪い考えです。プリミティブ (整数、ブール値など) のように構造体を推論できるように、構造体を不変にすることをお勧めします。この場合、コピーを返した方がよいでしょう。

于 2013-07-16T11:52:13.643 に答える
0

C# では、これを返すと値がコピーされます

正しくない。this ポインターは「現在の」オブジェクトを参照し、オブジェクトのディープ コピーまたはシャロー コピーを作成しません。

したがって、この:

foo.Transform(bar).TransformDifferently(yay);

正常に動作します。

于 2013-07-16T11:19:43.847 に答える