gpt4 book ai didi

c# - 使用命名参数和可选参数来区分构造函数

转载 作者:行者123 更新时间:2023-11-30 15:28:14 25 4
gpt4 key购买 nike

想象一个类,原则上可以通过指定两个属性之一的值来创建,这两个属性恰好具有相同的类型。以下代码通过使用 named and optional parameters 的组合来完成此操作区分两个构造函数:

class Program
{
static void Main()
{
//Note: these 2 ctors are distinguished only by the argument naming convention:
thing thingWithMass = new thing(mass: 10);
thing thingWithVolume = new thing(vol: 25);
}

class thing
{
int Density = 3;
int Mass;
int Vol;
public thing(int mass)
{
Mass = mass;
Vol = Mass/Density;
}

// Note the use of the optional variable to distinguish this ctor:
public thing(int vol, bool isVol=true)
{
Vol = vol;
Mass = Vol * Density;
}
}
}

所以(有点令人惊讶)这段代码可以完美地编译和运行,但它是不是错误的形式?这似乎有点像诡计,我想知道是否存在我不容易察觉的潜伏危险?有气味吗?

注意:在这种特殊情况下,我意识到我可以使用如下所示的单个构造函数完成基本相同的事情:

public thing(int mass=0, int vol=0) //plus a couple of if() statements in the body

但在我的实际情况下,还涉及很多其他参数,将它们全部组合到一个构造函数中会有点笨拙且难以阅读。

最佳答案

如果您的类有许多构造函数,它们的逻辑非常不同且参数类型相互冲突,请考虑使用静态工厂方法:

public static Thing CreateFromMass(int mass)
{
return new Thing(mass, 0);
}

public static Thing CreateFromVol(int vol)
{
return new Thing(0, vol);
}

如果你使用像这样的工厂方法,你可以让你的构造函数成为非公开的。

虽然可以根据参数名称区分构造函数,但不建议这样做,因为这在 C# 中很少见。请注意,您还被迫使用带有可选参数的技巧来实现此目的——这清楚地表明您做错了什么。

关于c# - 使用命名参数和可选参数来区分构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26043399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com