6

どう説明したらいいのかわからないので、タイトルが少しわかりにくいかもしれません。

... = new MyClass()を使用してクラスをインスタンス化し、インスタンス化中にこのクラスの非静的メソッドを即座に呼び出すことができるかどうかを知りたいですか?

たとえば、次のようなものです。

return new MyClass().SetName("some name");

私は以前にこのようなものを見たことがあると思いますが、それを見つけることができません。次のようなことをするのは少し面倒です...

MyClass myclass = new MyClass();
myclass.SetName("some name");
return myclass;

それを短くする方法、または私の最初の例のようにそれを行う方法はありますか?(代わりにプロパティを使用するように提案しないでくださいSetName(string)-これは単なる例です)

前もって感謝します!

4

7 に答える 7

19

プロパティがある場合、オブジェクト初期化子を使用できます。

return new MyClass { Name = "some name" };

本当に本当にメソッドを使用する必要がある場合、唯一のオプションは、メソッドにインスタンスを再度返すようにすることです。

public Foo SomeMethod()
{
    // Do some work
    return this;
}

これはあなたが書くことができます:

return new Foo().SomeMethod();

呼び出しているメソッドを変更できない場合の非常に極端な方法として、拡張メソッドを作成できます。

public static T ExecuteAndReturn<T>(this T target, Action<T> action)
{
    action(target);
    return target;
}

次に、次のように書くことができます。

return new Foo().ExecuteAndReturn(f => f.SomeMethod());

しかし、それは本当にファウルです。このような場合、ローカル変数を使用する方がはるかに簡単です...

于 2013-03-01T14:49:19.207 に答える
7

質問には大きな誤解があります:

...そして、インスタンス化中にこのクラスの非静的メソッドを即座に呼び出す

たとえば、次のようなものです。

return new MyClass().SetName("some name");

真実は、SetName関数の呼び出しはインスタンス化が終了した後に行われるということです。「インスタンス化中」には発生しません。これは、次とまったく同じです。

MyClass newInstance new MyClass();
return newInstance.setName("some name");

したがって、SetNameメソッドが呼び出されるまでに、コンストラクターは必要なすべての処理を完了し、オブジェクトはヒープ上で準備ができています。

これとは別に、構文的に実行可能であり、this他の人が指摘しているように戻る必要があります。もちろん、それに応じて戻りタイプを指定します。しかし、私はセッターのためにこれをしません...これはただ良くありません。

また、常に名前を設定する必要がある場合は、名前を引数として期待するコンストラクターを用意し、コンストラクターに設定することを検討してください。

public class MyClass
{
    public String name;
    public MyClass(String initialName)
    {
        name = initialName;
    }
}

次に、それを非常に短い形式で使用できます。

MyClass instance = new MyClass("someName");
于 2013-03-01T14:52:31.840 に答える
7

SetNameを返す場合はthis、最初のコード例でやりたかったことを正確に行うことができます。

于 2013-03-01T14:48:41.507 に答える
6

それは簡単にできます。通常、これは「流暢なインターフェース」と呼ばれますが、より適切なメソッド名が付いています。

SetNameを次のように機能させる方法は次のとおりです。

public MyClass SetName(...)
{
    ...
    return this;
}

これにより、希望どおりの構文が可能になります。

次に、そのような複数の呼び出しを、通常は異なるメソッドにチェーンできます。

return new MyClass().SetName("kkk").SetAge(44).SetAddres("...");

ただし、これらすべてを実行するより適切な構成を追加することも検討することをお勧めします。

于 2013-03-01T14:49:01.067 に答える
3

次のようにメソッドをチェーン可能にすることができます。

public void SetName(String name) {
    this._name = name;
    return this;
}
于 2013-03-01T14:48:58.890 に答える
3

SetNameそれをホストして返すクラスのタイプでない限りthis、中間変数を回避する方法はありません。もちろん、流暢な構文を採用して、SetNameリターンをオブジェクトにすることはできますが、それはC#のネイティブイディオムではありません。

class MyClass {
    public int A {get;private set;}
    public int B {get;private set;}
    public MyClass SetA(int a) {
        A = a;
        return this;
    }
    public MyClass SetB(int b) {
        B = b;
        return this;
    }
}

今、あなたはこれを行うことができます:

return new MyClass().SetA(123).SetB(456);
于 2013-03-01T14:49:21.457 に答える
1

ファクトリとして機能し、新しいインスタンスを返す静的プロパティを作成できます。その場合、呼び出しは次のようになります。

MyClass.GetInstance.SetName("some name");

これがあなたが望むものであるかどうかわからない。または、コンストラクター内からそのメソッドを呼び出して、必要なパラメーターをコンストラクターに渡してみませんか。

または、3番目のオプションとして、これらすべての追加ステップを処理してインスタンスを返すファクトリクラスを構築します。

于 2013-03-01T14:50:10.097 に答える