我可以使用主构造函数并定义构造函数体吗?

这是我使用辅助辅助构造函数的try --我知道this是模棱两可的,但我不知道是否有办法修复它……或者我必须求助于田野?

public class Thing(int a, int b) {
    public Thing(int a, int b) : this(a ,b) {
        // do some stuff using `a` and `b`
    }
}

推荐答案

如果您需要在构造函数中使用常规的构造函数,我认为在这里使用主构造函数是没有意义的,因为它们不是为这些事情而设计的.如果出于某种原因,你仍然想要,你可以考虑一些我认为丑陋的黑客.

例如,向主ctor添加一个虚拟参数:

public class Thing(int a, int b, object? _) 
{
    public Thing(int a, int b) : this(a ,b, null) {
        // do some stuff using `a` and `b`,
        Console.WriteLine($"{a}_{b}");
    }
}

或者引入一些虚拟字段来使一些静态的可调用方法来完成这项工作并赋值:

public class Thing(int a, int b)
{
    private int _ = DoThing(a, b);

    private static int DoThing(int a, int b)
    {
        Console.WriteLine($"{a}_{b}");
        return a + b;
    }
}

正如我所说的,变通方法并不是很好,在我看来,最好还是使用"普通"的ctor.

还请注意,至少有一些IDE(目前没有可用的VS),如Rider,提供了重构,将主ctor扩展为普通ctor:

enter image description here

enter image description here

enter image description here

所以你可以开始用主ctor来设计类,然后把它扩展成一个普通的类,这样你就可以省go 一些你认为繁琐的工作(同样,Rider/ReSharper也可以用普通的ctor为你生成字段和赋值).

Csharp相关问答推荐

发布.NET框架项目将.NET核心元素注入到web. connect中

如何使用Automapper映射两个嵌套列表

可为空的泛型属性

创建临时Collection 最有效的方法是什么?堆栈分配和集合表达式之间的区别?

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

WeakReference未被垃圾收集

附加标题不起作用,而添加则起作用

TCPClient阅读流

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

取决于您的数据量的多个嵌套循环

DbContext-传递自定义配置选项

如何在用户在线时限制令牌生成?

在两个已具有一对多关系的表之间添加另一个一对多关系

.NET:从XPath定位原始XML文档中的 node

无法使用[FromForm]发送带有图像和JSON的多部分请求

将FileStream的特定部分作为字节数组读取

.NET Google Workspace API获取错误CS0266

客户端/服务器RPC如何处理全局变量?

LINQ在GROUP BY和JOIN之后获取子列表

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值