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

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

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

//Code

SomeClass someClass = new SomeClass(someCriteria);

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

Можно ли реализовать его на С#?

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

SomeClass someClass = null;

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

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

Ответ 6

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

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

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

var someClass = SomeClassFactory.Create(someCriteria);
if(someClass != null)
{
}

Ответ 7

Конструкция new гарантирует, что объект будет возвращен (или выбрано исключение). Так, как рекомендовалось, factory или аналогичная концепция позволит вам применить свою логику.