【问题标题】:Why can't we use expression-bodied constructors?为什么我们不能使用表达式体构造函数?
【发布时间】:2015-01-27 10:42:00
【问题描述】:

使用 C# 6.0 中新的 Expression-Bodied Members 功能,我们可以采用如下方法:

public void Open()
{
    Console.WriteLine("Opened");
}

...并将其更改为具有等效功能的简单表达式:

public void Open() => Console.WriteLine("Opened");

但是,对于构造函数来说,情况并非如此。这样的代码无法编译:

private DbManager() => Console.WriteLine("ctor");

这也不是:

private DbManager() => {}

构造函数有什么理由不能从表达式体成员功能中受益,必须以传统方式声明?

【问题讨论】:

  • 我只能在这里提供一个猜测...基本上它们对构造函数的用处要小得多,而表达式主体成员的主要用例是它们 return 一些东西,而在构造函数中你没有返回任何东西。请注意,您的最后一个示例比仅编写代码没有=>更冗长。
  • 围绕构造函数的一些实验被 C# 6.0 放弃了。为 C# 7.0 计划了更多涉及构造函数的功能,并且决定这次不更改任何关于构造函数的内容。

标签: c# c#-6.0 visual-studio-2015


【解决方案1】:

它会比有用更令人困惑。特别是当您添加对另一个构造函数的调用时。

这是设计说明中的直接引用:

构造函数在头部有句法元素,形式为 this(...) 或 base(...) 初始化器,在粗箭头之前看起来很奇怪。更重要的是,构造函数几乎总是有副作用的语句,并且不返回值。

来自C# Design Notes for Nov 4, 2013

以更一般的方式:

总而言之,表达式主体允许用于方法和用户定义的运算符(包括转换),它们表示从函数返回的值,以及用于表示从 getter 返回的值的属性和索引器,并暗示不存在二传手。

【讨论】:

    【解决方案2】:

    现在 c# 7.0 已经发布,可以使用表达式体构造函数了。

    private DbManager() => Console.WriteLine("ctor");
    

    在 c# 7.0 中运行良好

    【讨论】:

    • @Gigi 他们从来都不是技术挑战。争论是他们“在一个胖箭头之前看起来很奇怪”。
    • 无法使用 2 个属性:List1 = new List<string>(); List2= new List<string>();
    • @Kiquenet 你可以使用元组模式来模拟你想要的:public Lists() => (List1, List2) = (new List<string>(), new List<string>())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多