0
var a = "test";
var @delegate = () => a;

Assert.AreEqual(@delegate(),"test"); //true

a = "12345678"

Assert.AreEqual(@delegate(),"test"); //still true, due to closure.

ただし、変数aがクラスレベルのプロパティである場合、2番目のアサーションは何を返しますか?trueまたはfalse?

たとえば、代わりに

string _a;
string a {get {return _a;} set{_a = value;}}

aがプロパティではなくメソッドだった場合、2番目のアサーションがfalseになることはわかっています。

4

2 に答える 2

4

クロージャは、値ではなく変数をキャプチャします。2番目のアサーションはfalseになります。

また、プロパティはメソッドであることに注意してください。get setこのようなプロパティのアクセサのペア

private string _a;

public string a
{
    get { return _a; }
    set { _a = value; }
}

実際にこのようなコードを生成します

private string _a;

public string get_a()
{
    return _a;
}

public void set_a(string value)
{
    _a = value;
}

変数のようなプロパティの使用法は単なる構文糖衣です

于 2012-10-17T18:22:25.253 に答える
2

それらはまったく同じように動作します。

public void ClosureOverVariable()
{
    var a = "x";

    Func<string> d = () => a;

    Console.WriteLine(d()); // print "x"

    a = "y";

    Console.WriteLine(d()); // print "y"
}

class Foo
{
    public string X { get; set; }
}

public void ClosureOverProperty()
{
    var a = new Foo
        {
            X = "a"
        };

    Func<string> d = () => a.X;

    Console.WriteLine(d()); // prints "a"

    a.X = "y";

    Console.WriteLine(d()); // print "y"
}
于 2012-10-17T18:39:21.457 に答える