为什么不能用c#object initializer语法调用方法?
在我看来,属性setter是按照它们在语法中设置的顺序调用的,那么为什么不允许调用方法呢?如果有充分的理由,我就错过了。
我意识到方法和属性之间的语义差异以及技术上的相似之处。这个问题的目的是探究一个很好的技术原因,即他们没有包含该功能。
此。 __curious_geek,我听到你在说什么,但我确信他们没有包含一些功能,因为它在技术上并不可行。
这就是我所追求的一切。听到的压倒性的不受欢迎的声音响亮而清晰。 Stackoverflow不再是“问答网站”,而是“保护您的问题网站”。
样本用法:
var mySuperLongVariableNameThatIDontWantToTypeOverAndOverAgainAndIsntThatTheWholePointAnyway = new Thingy
{
Name = "Marty McFly",
AddChildren("Biff","Big Bird","Alf"),
// 1000 other properties and method calls.....
}
答案 0 :(得分:6)
答案在于名称 - 对象初始化程序语法是语法糖,可以直观地对对象的初始状态进行分组。方法会更改对象状态,因此一旦更改,它就不再是初始状态。
例如:说你买车。它是一辆红色轿跑车,上面有55,000英里。然后,你决定开车。它最终有55,500英里。它已经从最初的状态改变了:
var c = new Car() {Color = "Red",
Style = Styles.Coupe,
Mileage = 55000};
// c.Mileage is 55,000
c.Drive();
// c.Mileage is 55,500
在这个有点人为的例子中,该方法具有副作用,因此将对象从其初始55,000mi状态更改为55,500mi状态。这与购买55,500英里的汽车不同。
答案 1 :(得分:6)
如果你真的想要这样做,你可以作弊我想...
class C {
int BadProperty {
set {
SomeMethod(value);
}
}
void SomeMethod(int value) {
// here is where you do really, really bad things
}
}
然后这样称呼它!
var fail = new C { BadProperty = 1 };
答案 2 :(得分:2)
如果方法失败怎么办?基本的想法是,它只是一个语法糖。 Eric Lippert很多时候被问及“为什么C#不支持X功能?”。他的回答总是
“因为没有人设计,指定, 实施,测试,记录和 发布了这个功能。“ - Eric Lippert。
答案 3 :(得分:1)
这完全是关于订单,必须先使用所有字段和所有声明的方法初始化Class,然后才能保证安全地运行方法。
答案 4 :(得分:0)
如果您要问的话,可以使用命名参数调用方法:
someMethod(param1: "Hello World", param2: "Some Other Value");