关闭和财产

时间:2012-10-17 18:20:56

标签: c# .net lambda closures

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

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

a = "12345678"

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

但是,如果变量a是类级别属性,那么第二个断言将返回什么 - 是真还是假?

例如,如果a代替

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

如果a是方法而不是属性,我知道第二个断言将是假的。

2 个答案:

答案 0 :(得分:4)

闭包捕获变量,而不是值。第二个断言是错误的。

此外,值得注意的是属性方法。这个属性的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;
}

变量等属性的使用只是语法糖

答案 1 :(得分: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"
}