Обнуляемые ссылочные типы и предупреждения конструктора - PullRequest
2 голосов
/ 15 апреля 2020

Я пытаюсь использовать в своем проекте C# 8 недействительных ссылочных типов и заставить его плавно работать с EF Core.

Следуя этому руководству , я заставил свои классы сущностей иметь Конструкторы принимают все данные, необходимые для инициализации их ненулевых свойств:

public class MyEntity
    {
        public MyEntity(int someNumber, string name, string shortName, bool active)
        {
            SomeNumber= someNumber;
            Name = name;
            ShortName = shortName;
            Active = active;
        }

        public int SomeNumber { get; set; }
        public string Name { get; set; }
        public string ShortName { get; set; }
        public string? SomethingOptional { get; set; }
        public bool Active { get; set; }
    }

В моем бизнес-случае мне иногда нужно обновить все свойства объекта. Я могу использовать установщики свойств, но поскольку я хочу убедиться, что я ничего не пропускаю, удвоив синтаксис инициализации (и в действительности мои сущности могут иметь 10 или более свойств), я решил создать publi c Update () Функция для удобства и вызывает ее вместо тела конструктора:

        public MyEntity(int someId, string name, string shortName, bool active)
        {
            Update(someId, name, shortName, active);
        }

        public void Update(int someId, string name, string shortName, bool active)
        {
            SomeNumber = someId;
            Name = name;
            ShortName = shortName;
            Active = active;
        }

Теперь, при создании сущности, я вызываю конструктор, а при его изменении я вызываю Update (). Однако теперь компилятор выдает предупреждение об обнуляемости (CS8618), что не обнуляемые свойства не инициализируются конструктором . Очевидно, невозможно предположить, что вызов Update будет их инициализировать.

Возможно, я немного переоценил это с помощью этого метода Update (), но теперь мне интересно, есть ли способ сделать компилятор поверьте, что мой конструктор будет инициализировать свойства ?

1 Ответ

0 голосов
/ 15 апреля 2020

Если вы уверены, что делаете, то вы можете отключить предупреждение компилятора с помощью

#pragma warning disable CS8618
public MyEntity(int someNumber, string name, string shortName, bool active)
{
    SomeNumber= someNumber;
    Name = name;
    ShortName = shortName;
    Active = active;
}
#pragma warning disable CS8618

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

class MyClass
{
    private string m_str1;
    private string m_str2;

    public MyClass()
    {
        Init(out m_str1, out m_str2);
    }

    private void Init(out string str1, out string str2)
    {
        str1 = string.Empty;
        str2 = string.Empty;
    }
}
...