C#构造函数重载

Ale*_*kov 62 c# constructor constructor-overloading

我如何在C#中使用构造函数,如下所示:

public Point2D(double x, double y)
{
    // ... Contracts ...

    X = x;
    Y = y;
}

public Point2D(Point2D point)
{
    if (point == null)
        ArgumentNullException("point");
    Contract.EndContractsBlock();

    this(point.X, point.Y);
}
Run Code Online (Sandbox Code Playgroud)

我需要它不要从另一个构造函数复制代码...

Mar*_*ade 179

public Point2D(Point2D point) : this(point.X, point.Y) { }
Run Code Online (Sandbox Code Playgroud)

  • point不能为null,因为它未定义为可空类型(Point2D?point) (4认同)
  • @PowerRoy,你假设`Point2D`是一个值类型.如果它是一个类,它可能是null. (2认同)
  • 谢谢..对于其他人:如果只传递":this"而没有参数 - 例如,两个 - 空构造函数代码加上重载构造函数代码将运行.在重载构造函数与空+新代码具有相同代码的情况下很有用. (2认同)

Joã*_*elo 61

您可以将您的公共逻辑分解为私有方法,例如Initialize调用从两个构造函数调用的方法.

由于您要执行参数验证,因此无法使用构造函数链接.

例:

public Point2D(double x, double y)
{
    // Contracts

    Initialize(x, y);
}

public Point2D(Point2D point)
{
    if (point == null)
        throw new ArgumentNullException("point");

    // Contracts

    Initialize(point.X, point.Y);
}

private void Initialize(double x, double y)
{
    X = x;
    Y = y;
}
Run Code Online (Sandbox Code Playgroud)

  • 作为不变性的狂热粉丝,我想指出这种方法的一个缺点是你无法初始化只读字段:( (17认同)
  • 首先尝试Mark Cidade的回答.使用这个作为后备. (7认同)

jp2*_*ode 5

也许你的班级不完整.就个人而言,我使用私有init()函数与我的所有重载构造函数.

class Point2D {

  double X, Y;

  public Point2D(double x, double y) {
    init(x, y);
  }

  public Point2D(Point2D point) {
    if (point == null)
      throw new ArgumentNullException("point");
    init(point.X, point.Y);
  }

  void init(double x, double y) {
    // ... Contracts ...
    X = x;
    Y = y;
  }
}
Run Code Online (Sandbox Code Playgroud)