Как «правильно» (идиоматически) избегать CS9107 при передаче параметров первичного конструктора в базу

В C# 12 мы получаем первичные конструкторы для обычных классов.

Рассмотрим следующий код:

      new Derived("XXX").Test();

public class Base(string name)
{
    protected void Log() => Console.WriteLine("Base: " + name);
}

public class Derived(string name) : Base(name)
{
    public void Test()
    {
        base.Log();
        Console.WriteLine("Derived: " + name);
    }
}

Это дает следующее предупреждение дляпараметр дляпервичный конструктор:

Program.cs(8,42): Предупреждение CS9107: Параметр «имя строки» фиксируется в состоянии включающего типа, и его значение также передается базовому конструктору. Значение также может быть захвачено базовым классом.

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

      new Derived("XXX").Test();

public class Base
{
    protected readonly string _name;

    protected Base(string name)
    {
        _name = name;
    }

    protected void Log() => Console.WriteLine("Base: " + _name);
}


public class Derived : Base
{
    public Derived(string name) : base(name) { }

    public void Test()
    {
        base.Log();
        Console.WriteLine("Derived: " + base._name);
    }
}

Пожалуйста, порекомендуйте.


Примечание. Это надуманный пример, сокращенный из более сложной иерархии классов с использованием объектов конфигурации из Microsoft.Extensions.Configuration, где всем нескольким уровням классов требуется доступ к конфигурации.

0 ответов

Другие вопросы по тегам