5

this キーワードを強制的に ref 引数として機能させる方法はありますか? オブジェクトの複数のプロパティを変更するビジターを渡したいのですが、これは値パラメーターのように振る舞いたいだけです。

オブジェクト内のコード:

public void Accept(Visitor<MyObject> visitor)
{
    visitor.Visit(this);
}

訪問者のコード:

public void Visit(ref Visitor<MyObject> receiver)
{
    receiver.Property = new PropertyValue();
    receiver.Property2 = new PropertyValue();
}
4

4 に答える 4

10

参照するものを実際に変更receiverするわけではないので、refキーワードは必要ありません。ただし、その場合、this別のインスタンスを参照することはできません。

thisパラメータとして渡すには、次のrefように記述する必要があります。

Visit(ref this);

そのコードはコンパイルされません

于 2010-04-15T16:15:51.907 に答える
5

あなたがクラスの場合、キーワードVisitor<T>は必要ありません。ref

メソッドで変更されると、クラス内のすべての情報が自動的に変更されます

于 2010-04-15T16:16:05.180 に答える
4

より大きな質問に対する回答がすでに得られているようです。しかし、とにかくこれを考えてみましょう。

this キーワードを強制的に ref 引数として機能させる方法はありますか?

はい。論理的に処理してください。

  • ref 引数は変数のエイリアスを作成します。
  • 「this」は参照型の変数ではありません
  • 「this」は値型の変数です
  • したがって、「ref this」を渡す唯一の方法は、値型のインスタンス メソッドからです。

実際、これが「this」が値型に裏で実装されている方法です。(最悪の場合! 実際にはこれを行わないでください) 変更可能な値の型がある場合:

struct S
{
    private int x;
    public void M()
    {
        this.x = 123;
    }
}
...
S s = new S();
s.M();

S のインスタンスは値渡しなので、M が s を変更するのはどうしてですか? s は参照渡しする必要があります。実際、生成されるコードは、次のように記述した場合とまったく同じです。

struct S
{
    private int x;
    public static void M(ref S THIS)
    {
        THIS.x = 123;
    }
}
...
S s = new S();
S.M(ref s);

つまり、構造体の「this」は既に ref パラメーターとして渡されているため、再度渡しても問題はありません。そうすることは、ほとんどの場合ひどい考えですが、合法です。

于 2010-04-16T06:16:50.047 に答える
0

本当に ref キーワードが必要ですか?

ref は、受信者インスタンスを変更する場合に役立ちます。たとえば、receiver = null;

それ以外は

receiver.Property は ref キーワードなしでもアクセスできます

于 2010-04-15T16:19:24.677 に答える