0

C#では、参照が参照に移行することを許可しないようにする方法があるかどうか疑問に思っていました。私が何を意味するかを説明するためのFAKE c# コードを次に示します。

class foo  {}

class bar
{
    public locked foo Foo; //of course locked doesn't actually exist
}

void main()
{
    foo myFoo = new foo();
    bar myBar == new bar();
    myBar.Foo = myFoo;

    myFoo = null

    if (myBar.Foo == null)
    {
        println("foo = null");
    }
}

//will print "foo = null"

明らかにこれはコンパイルされず、foo を削除すると、myBar.Foo に移行するだけです。

4

2 に答える 2

1
myBar.Foo = myFoo;

myFoo = null

やってもヌルにはなりmyFoo = nullません。myBar.Foo引き続き古いオブジェクトを参照します。

フィールドはrefchsarpにある可能性があり、これを回避することはできません. より良い説明はここにあります - How do I assign by "reference" to a class field in c#?

于 2013-01-12T22:29:45.957 に答える
0

あなたが望んでいるように見えることは、少なくとも直接的には不可能です。「移行」という用語は標準的ではなく、紛らわしいので、ここで他の読者に何を望んでいるかを説明します。

何をしているのか説明しましょうmyBar.Foo = myFooFoo呼び出されmyBarたストレージの場所は、ローカルのストレージの場所を現在占有しているオブジェクトを指していると言っていますmyFoo。あなたが望んでいるように見えるmyBar.Fooのは、保存場所のエイリアス(つまり別の名前)として機能することですmyFoo

Eric Lippert は、ここに投稿された同様の質問に対する優れた回答を持っています。これは、これが許可されていない理由と代わりに何をすべきかを説明しています。彼は、「レンズ」と呼ばれることもある、ゲッター メソッドとセッター メソッドを単一のオブジェクトにキャプチャし、そのオブジェクトへの参照を渡す構造について説明しています。

于 2013-01-12T22:43:02.190 に答える