Как «правильно» (идиоматически) избегать 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, где всем нескольким уровням классов требуется доступ к конфигурации.