【发布时间】:2012-05-23 03:42:26
【问题描述】:
我想看看我是否可以以 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
为什么名字不变?
【问题讨论】:
-
有什么方法可以获取 Person 类的代码?
-
@EtherDragon:没有类,
CreatePerson返回一个匿名类型的实例。 -
我认为这里的关键是您返回的是匿名类型,而匿名类型始终是不可变的。当您
new启动它时,您所做的任何事情(反射黑客可能除外)都不会修改您放入该匿名类型实例的值。
标签: c# dynamic lambda closures