C # Expression Bodied Constructor - Есть ли способ объединить с проверкой нуля? - PullRequest
1 голос
/ 08 апреля 2019

Есть ли рекомендуемый или предпочтительный способ сочетания C # 7 "Bodied Constructors" с другими действиями, такими как проверка нуля и создание исключений?

При написании класса C #,Я привык к тому, что в своем конструкторе я могу тестировать аргументы для нулей (и генерировать исключения, если это необходимо), например: -

class Person
{
   private string _name;
   private SomeClass _someClass; 

   public Person(string name, SomeClass someClass)
   {
       _name = name ?? throw new ArgumentNullException(nameof(name));
       _someClass = someClass?? throw new ArgumentNullException(nameof(someClass));
   }
}

Я только что узнал о Конструкторах с выражениями ,где простая версия моего кода может выглядеть следующим образом: -

class Person
{
   private string _name;
   private SomeClass _someClass; 

   public Person(string name, SomeClass someClass)
      => (_name, _someClass) = (name, someClass);

}

Вышеизложенное изначально кажется привлекательным из-за возможности сократить объем стандартного кода, необходимого для назначения аргументов переменным-членам.

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

Насколько я могу судить, единственный способвокруг это встроенный код, такой как проверка на нуль-слияние, например: -

...
   public Person(string name, SomeClass someClass)
      => (_name, _someClass) = 
        (
         name ?? throw new ArgumentNullException(nameof(name ), 
         someClass ?? throw new ArgumentNullException(nameof(someClass)
        ));

Хотя я и пытался улучшить разборчивость с помощью пробелов, на мой взгляд, вышесказанное не так просточитать как исходный пример - и на самом деле не сохранил никакой печати. ​​

В: Есть ли лучший способ, которым я мог бы подойти к этому, или я побеждаю цель этого нового стиля конструктора?(т.е. я должен просто придерживаться оригинального подхода)

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Я вижу стиль «Назначение кортежей» как хороший краткий способ сказать: «Мой класс инициализирован из этих участников, и больше ничего не происходит». Я могу взглянуть на это и сразу же понять, что именно это и задумал автор.

Как только происходит еще одна вещь (проверка в вашем примере), вы должны использовать полноценный конструктор. Как вы говорите, вы можете сделать это, но это выглядит намного хуже.

Действительно, мы используем этот стиль только потому, что у нас еще нет типов записей. Когда они у нас есть, я не думаю, что мы увидим это в коде.

0 голосов
/ 08 апреля 2019

Я не собираюсь критиковать вас за попытки.100

Дело в том, что обе версии генерируют практически один и тот же код.

class Person
{
   private string _name;
   private string _someClass; 

   public Person(string name, string someClass)
   {
       _name = name ?? throw new ArgumentNullException(nameof(name));
       _someClass = someClass?? throw new ArgumentNullException(nameof(someClass));
   }
}

становится

class Person
{
    private string _name;

    private string _someClass;

    public Person(string name, string someClass)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }
        _name = name;
        if (someClass == null)
        {
            throw new ArgumentNullException("someClass");
        }
        _someClass = someClass;
    }
}

см. На sharplab.io

и

class Person
{
   private string _name;
   private string _someClass; 

   public Person(string name, string someClass)
       => (_name, _someClass) = 
           (
               name ?? throw new ArgumentNullException(nameof(name)), 
               someClass ?? throw new ArgumentNullException(nameof(someClass))
           );
}

становится

class Person
{
    private string _name;

    private string _someClass;

    public Person(string name, string someClass)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }
        if (someClass == null)
        {
            throw new ArgumentNullException("someClass");
        }
        _name = name;
        _someClass = someClass;
    }
}

см. На sharplab.io

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...