我无法从闭包修改变量,为什么?

时间:2012-05-23 03:42:26

标签: c# dynamic lambda closures

我想知道我是否可以用javascript-fashion方式编写一些c#代码但是我遇到了意想不到的行为。我知道c#没有被破坏,但我不明白什么是错的,为什么它没有做我认为应该做的事情。

代码

class Program
{
    static void Main(string[] args)
    {
        var person = CreatePerson(new{
            FirstName = "Lucas",
            LastName = "Ontivero",
            Age = 34
        });

        Console.WriteLine("Name....... : {0}", person.FullName);
        Console.WriteLine("IsJuvenile. : {0}", person.IsJuvenile);

        person.SetFirstName("Pablo");
        Console.WriteLine("Name....... : {0}", person.FullName);

        Console.ReadKey();
    }

    static private dynamic CreatePerson(dynamic cfg)
    {
        string firstName = cfg.FirstName;
        string lastName = cfg.LastName;
        var age = cfg.Age;

        return new{
            FullName = string.Format("{0} {1}", firstName, lastName),
            FirstName = firstName,
            LastName = lastName,
            SetFirstName = new Action<string>(fn => firstName= fn),
            SetLastName = new Action<string>(ln => lastName = ln),
            IsJuvenile = age < 18 
        };
    }
}

输出

Name....... : Lucas Ontivero
IsJuvenile. : False
Name....... : Lucas Ontivero

但我希望

Name....... : Lucas Ontivero
IsJuvenile. : False
Name....... : Pablo Ontivero

为什么firstName不会改变?

2 个答案:

答案 0 :(得分:3)

它确实......但FullName没有。它在CreatePerson内计算并存储为string,而不是稍后评估为字符串的属性。

您可以使用lambdas来导致延迟评估,就像使用SetFirstName一样。

答案 1 :(得分:0)

它给你拳头分配FullName 您需要重新分配FullName

FullName = string.Format("{0} {1}", firstName, lastName)

开启SetFirstName功能