77

How I can use constructors in C# like this:

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);
}

I need it to not copy code from another constructor...

0

3 Answers 3

226
public Point2D(Point2D point) : this(point.X, point.Y) { }
Sign up to request clarification or add additional context in comments.

7 Comments

point cannot be null because it is not defined as a nullable type (Point2D? point)
Describe what you mean by using Contracts. Mark's answer is right.
@PowerRoy, you are assuming Point2D is a value type. If it's a class it may be null.
@PowerRoy: point can be null because... we don't know how it is defined.
Thanks.. For other people: If you pass just ": this" with no arguments - for example, the both - empty constructor code plus the overloading constructor code will run. Useful in case that the overloading constructor has the same code as the empty + new code.
|
73

You can factor out your common logic to a private method, for example called Initialize that gets called from both constructors.

Due to the fact that you want to perform argument validation you cannot resort to constructor chaining.

Example:

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;
}

3 Comments

As an avid fan of immutability, I'd like to note that a drawback of this method is that you cannot initialize readonly fields :(
I was thinking of this exact same solution, and now you confirmed it's a good idea. Thanks :)
Try Mark Cidade's answer first. Use this one as a fallback.
6

Maybe your class isn't quite complete. Personally, I use a private init() function with all of my overloaded constructors.

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;
  }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.