Можем ли мы прервать создание объекта в конструкторе - PullRequest
17 голосов
/ 14 марта 2011

Не могли бы вы помочь мне, пожалуйста. У меня есть одна идея, но я не знаю, как ее реализовать.

Итак, вопрос: Можем ли мы прервать создание объекта в конструкторе т.е.

//Code

SomeClass someClass = new SomeClass(someCriteria);

Поэтому, если someCriteria не отвечает нашим требованиям, мы не должны создавать объект и должны возвращать ноль вместо нового объекта.

Возможно ли реализовать это в C #?

Ответы [ 7 ]

21 голосов
/ 14 марта 2011

Лучший способ - фабричный класс, но если ваш класс такой маленький, вы можете использовать это:

class SomeClass
    {
        private string _someCriteria;

        private SomeClass(string someCriteria)
        {
            _someCriteria = someCriteria;
        }

        public static SomeClass CreateInstance(string someCriteria)
        {
            if (someCriteria.Length > 2)
            {
                return new SomeClass(someCriteria);
            }
            return null;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            // returns null
            SomeClass someClass = SomeClass.CreateInstance("t");

            // returns object
            SomeClass someClass2 = SomeClass.CreateInstance("test");
        }
    }
9 голосов
/ 14 марта 2011

Возможно, вы захотите использовать фабричный класс, который создает экземпляры SomeClass, возвращающие значение null, если someCriteria недопустим.

5 голосов
/ 14 марта 2011

Обычно вы проверяете параметры конструктора, если они действительны. Если нет, вы обычно выбрасываете исключение.

Я также прочитал хороший совет по предоставлению статических методов для проверки параметров конструктора. Это позволяет пользователю вашего класса проверить, удастся ли ему все, что он собирается передать в конструкторе. Те, кто уверен, что параметры в порядке (они сделали своего рода проверку), пойдут напрямую с конструктором.

Также подумайте, что пользователь вашего класса, возможно, сделает с null вместо объекта (если использовался какой-то класс фабрики). Может ли это привести к исключению NullPointerException в следующей строке? Обычно хорошей идеей является как можно скорее остановить неправильные вещи, в этом случае вывести исключение и завершить. Это более чистое решение, чем возвращение нулевого значения, и если кто-то действительно хочет (это определенно не будет лучшей практикой), он все равно может поймать это исключение ...

2 голосов
/ 14 марта 2011

Если параметры вашего конструктора являются недопустимыми, рассмотрите выбрасывание ArgumentException или одного из его классов-потомков (например, ArgumentOutOfRangeException).

1 голос
/ 14 марта 2011

Это было бы возможно.Другим способом было бы поставить вашу проверку перед созданием объекта.Вот так

SomeClass someClass = null;

if (someCriteria == VALID)
{
    someClass = new SomeClass(someCriteria);
}

Надеюсь, это поможет.

0 голосов
/ 14 марта 2011

Конструкция new гарантирует, что объект будет возвращен (или сгенерировано исключение).Поэтому, как рекомендовано bleeeah, фабричная или аналогичная концепция позволит вам применить вашу логику.

0 голосов
/ 14 марта 2011

Нет, это невозможно напрямую.

Вы можете выдать исключение и добавить требуемый код для проверки исключения и присвоения переменной null.

Лучшим решением было бы использование Фабрики, которая возвращала бы ноль, если какое-то условие не выполнено.

var someClass = SomeClassFactory.Create(someCriteria);
if(someClass != null)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...