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

本文关键字:构造函数 参数 方法 | 更新日期: 2023-09-27 18:25:40

例如,假设我正在定义一个用于表示复数的Complex类。我想定义两个构造函数,这样我就可以编写例如:

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) { ... }

因为两个构造函数将具有相同的签名,这是不允许的。但在C#4中,我可以使用一个可选的参数来写这篇文章:

public Complex(double x, double y) { ... }
public Complex(double r, double theta, bool unused=true) { ... }

它起作用了,然后我可以按预期使用上面的构造函数调用。unused论点的唯一目的是使签名不同;无论是在定义构造函数还是在调用构造函数时,它都是完全未使用的。

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

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

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

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::FromDoubleComplex::FromDoubleAndTheta

你可以更进一步,让真正的构造函数私有化,以强制进行构建。

例如,请参见TimeSpan的FromDays和FromHours。

p.s。使用更好的名称:)

HTH

我唯一能想到的就是制作一个构造函数(double,double),另一个可以是double,Func。

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

在上面的例子中,您正在进行计算,计算的结果是该构造函数的第二个值。如果一直都是这种情况,那么您可以将其作为Func参数。有点像黑客,但这可能比有一个可选的第三个参数什么都不做要好。