为什么不能用c#object initializer语法调用方法?

时间:2011-06-03 15:44:04

标签: c# .net

为什么不能用c#object initializer语法调用方法?

在我看来,属性setter是按照它们在语法中设置的顺序调用的,那么为什么不允许调用方法呢?如果有充分的理由,我就错过了。

修改

我意识到方法和属性之间的语义差异以及技术上的相似之处。这个问题的目的是探究一个很好的技术原因,即他们没有包含该功能。

此。 __curious_geek,我听到你在说什么,但我确信他们没有包含一些功能,因为它在技术上并不可行。

这就是我所追求的一切。听到的压倒性的不受欢迎的声音响亮而清晰。 Stackoverflow不再是“问答网站”,而是“保护您的问题网站”。

编辑2

样本用法:

var mySuperLongVariableNameThatIDontWantToTypeOverAndOverAgainAndIsntThatTheWholePointAnyway  = new Thingy
    {
        Name = "Marty McFly",
        AddChildren("Biff","Big Bird","Alf"),
        // 1000 other properties and method calls.....
    }

5 个答案:

答案 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");