Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C:相同的签名方法/构造函数和命名参数_C#_C# 4.0 - Fatal编程技术网

C# C:相同的签名方法/构造函数和命名参数

C# C:相同的签名方法/构造函数和命名参数,c#,c#-4.0,C#,C# 4.0,例如,假设我正在定义一个表示复数的复杂类。我想定义两个构造函数,以便编写示例: Complex z1 = new Complex(x: 4, y: 3); Complex z2 = new Complex(r: 2, theta: Math.PI / 4); 但是,我不能这样定义构造函数: public Complex(double x, double y) { ... } public Complex(double r, double theta) { ... } 因为两个构造函数将具有相

例如,假设我正在定义一个表示复数的复杂类。我想定义两个构造函数,以便编写示例:

Complex z1 = new Complex(x: 4, y: 3);
Complex z2 = new Complex(r: 2, theta: Math.PI / 4);
但是,我不能这样定义构造函数:

public Complex(double x, double y) { ... }
public Complex(double r, double theta) { ... }
因为两个构造函数将具有相同的签名,这是不允许的。但在C4中,我可以用一个可选参数来写:

public Complex(double x, double y) { ... }
public Complex(double r, double theta, bool unused=true) { ... }
它可以工作,然后我可以按预期使用上述构造函数调用。未使用参数的唯一目的是使签名不同;无论是在定义还是调用构造函数时,它都是完全未使用的


对我来说,这似乎是一个丑陋的把戏:有更好的选择吗?

将构造函数设为私有并具有静态工厂样式的函数

public static Complex CreateComplexPolar(double r, double theta);
public static Complex CreateComplex(double x, double y);
您可以根据输入的内容对其进行验证

另一种可能是创建一个封装输入的类型,并使用前面提到的构造函数

public struct PolarCoordinates
{
  public double Rho;
  public double Theta;
}

public struct CartesianCoordinates
{
  public double X;
  public double Y;
}

public Complex(PolarCoordinates pc);
public Complex(CartesianCoordinates cc);

创建一个静态方法来创建类,比如Complex::fromdoull和Complex::fromdoullentheta

您可以更进一步,将真正的构造函数设置为私有,以强制进行该构造

例如,请参见TimeSpan的和

p、 美国。 使用更好的名称:


HTH

我唯一能想到的就是让一个构造函数是double,double,另一个可以是double,Func

public Complex(double x, double y) { ... }
public Complex(double r, Func<double> theta) { ... }

在上面的示例中,您正在进行计算,计算结果是该构造函数的第二个值。如果总是这样,那么您可以将其改为Func参数。有点像黑客,但这可能比有一个可选的不起任何作用的第三个参数要好。

这并不能真正为您带来任何好处-您无法控制使用两个双参数调用哪一个参数—始终是同一个参数。您是对的,但我的目的是通过命名参数显式选择要使用的构造函数。实际上,θ只是一个角度。π/4实际上不是一种计算,只是一种指定角度值的方便方法。我也可以写一些类似0.79的东西。所以第二个论点应该是双重的,我明白你的意思。尽管您仍然可以通过这种方式使用它来区分构造函数。不过还是个黑客。您是否考虑过使用无参数构造函数,然后为各种参数组合使用属性?或者我想你可以创建一个基类,让每个构造函数成为一个从基类继承的独立类。无参数构造函数属性:让我担心的是你可以创建一个“未初始化”的对象。子分类:一个类应该代表一种对象,而不是一种构造函数。。。同样,这是一个黑客行为……上面提到的带有静态工厂的私有构造函数可能是最好的选择。不过,我仍然觉得应该有一个更雄辩的解决方案。