为什么可以';使用c#对象初始值设定项语法调用方法

本文关键字:方法 调用 语法 对象 使用 为什么 | 更新日期: 2023-09-27 17:58:24

为什么不能用c#对象初始值设定项语法调用方法?

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

编辑

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

这个__curious_geek,我听到你在说什么,但我相信他们没有包括一些功能,因为它在技术上不可行。

这就是我所追求的。压倒一切的不受欢迎的声音清晰而响亮。堆栈溢出不再是"溢出";问答网站";而是一个";为你的提问网站辩护;。

编辑2

示例用法:

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

为什么可以';使用c#对象初始值设定项语法调用方法

答案在名称中--对象初始值设定项语法是直观地对对象的初始状态进行分组的语法糖。方法会更改对象状态,因此一旦更改,它就不再是初始的状态。

例如:假设你买了一辆车。这是一辆红色轿跑车,行驶了55000英里。然后,你决定驾驶它。它最终行驶了55500英里。它已经从最初的状态改变了:

var c = new Car() {Color = "Red",
                   Style = Styles.Coupe,
                   Mileage = 55000};
// c.Mileage is 55,000
c.Drive();
// c.Mileage is 55,500

在这个有点做作的例子中,该方法有一个副作用,因此将对象从最初的55000mi状态更改为55500mi状态。这与购买一辆行驶55500英里的汽车不同。

如果你真的想这么做,我想你可以作弊。。。

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 };

如果方法失败怎么办?其基本思想是,它只是一种句法糖。EricLippert多次被问及"为什么C#不支持特性X?"。他的答案总是

"因为没有人设计、指定,实施、测试、记录和提供了该功能。"-埃里克·利珀特。

这一切都与订单有关,必须使用所有字段和所有声明的方法初始化class,才能保证安全地运行方法。

您可以调用带有命名参数的方法,如果这是您想要的:

someMethod(param1: "Hello World", param2: "Some Other Value");