我想知道我是否可以用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不会改变?
答案 0 :(得分:3)
它确实......但FullName
没有。它在CreatePerson
内计算并存储为string
,而不是稍后评估为字符串的属性。
您可以使用lambdas来导致延迟评估,就像使用SetFirstName
一样。
答案 1 :(得分:0)
它给你拳头分配FullName 您需要重新分配FullName
FullName = string.Format("{0} {1}", firstName, lastName)
开启SetFirstName
功能