Обнуляемые типы значений - PullRequest
0 голосов
/ 02 июня 2009

Если тип значения объявлен как обнуляемый, как мне принять меры предосторожности для этого? То есть если в конструкторе у меня есть:

public Point3 ( Point3 source )
{
    this.X = source.X;
    this.Y = source.Y;
    this.Z = source.Z;
}

произойдет ли сбой, если источник будет нулевым?

Ответы [ 5 ]

10 голосов
/ 02 июня 2009

Я не вижу возможности Point3 быть null, если это тип значения. Вы не пропустите знак вопроса? И если вы действительно имеете в виду Point3?, то вы должны получить к нему доступ как:

public Point3 ( Point3? source )
{
    this.X = source.Value.X;
    this.Y = source.Value.Y;
    this.Z = source.Value.Z;
}

и в этом случае свойство Value сгенерирует исключение, если оно null.

3 голосов
/ 02 июня 2009

Вызывающий этот метод не сможет пройти в обнуляемую точку, поскольку метод принимает обычную точку, а не обнуляемую. Поэтому вам не нужно беспокоиться о том, что Point является нулем в вашем коде конструктора.

2 голосов
/ 02 июня 2009

Да, это не получится, если source будет нулевым.

Вам нужно будет решить, каким должно быть правильное поведение, если source равно нулю. Вы можете просто выбросить исключение.

public Point3 ( Point3? source )
{
    if (source == null) 
    {
        throw new ArgumentNullException("source");
    }

    this.X = source.Value.X;
    this.Y = source.Value.Y;
    this.Z = source.Value.Z;
}

Или, если вы не хотите принимать null значения для source, просто оставьте метод таким, как он есть в вашем примере. Этот метод не принимает Nullable<Point3>, поэтому вам не нужно беспокоиться о том, что в этом случае null.

1 голос
/ 02 июня 2009
    public Point3(Point3? source) { 
       this.X = source.GetValueOrDefault().X; 
        this.Y = source.GetValueOrDefault().Y;
        this.Z = source.GetValueOrDefault().Z; 
    }
1 голос
/ 02 июня 2009

Если бы source было Point3?, это не было бы Point3. Так что, насколько я знаю, не получится компилировать время. Чтобы отправить Point3?, вам нужно будет использовать .Value, что приведет к исключению, которое, я полагаю, будет нулевым.

...