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

Chr*_*isJ 2 c# c#-4.0

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

Complex z1 = new Complex(x: 4, y: 3);
Complex z2 = new Complex(r: 2, theta: Math.PI / 4);
Run Code Online (Sandbox Code Playgroud)

但是,我不能像这样定义构造函数:

public Complex(double x, double y) { ... }
public Complex(double r, double theta) { ... }
Run Code Online (Sandbox Code Playgroud)

因为两个构造函数都具有相同的签名,这是不允许的.但是在C#4中我可以使用可选参数来编写它:

public Complex(double x, double y) { ... }
public Complex(double r, double theta, bool unused=true) { ... }
Run Code Online (Sandbox Code Playgroud)

它工作,我可以按预期使用上面的构造函数调用.unused论证的唯一目的是使签名不同; 它在定义和调用构造函数时都是完全未使用的.

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

lin*_*r27 7

使构造函数为私有,并具有静态工厂样式函数.

public static Complex CreateComplexPolar(double r, double theta);
public static Complex CreateComplex(double x, double y);
Run Code Online (Sandbox Code Playgroud)

您可以根据输入进行验证.

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

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);
Run Code Online (Sandbox Code Playgroud)