在 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);
}
}
Run Code Online (Sandbox Code Playgroud)
string name
这会对主构造函数的参数发出以下警告Derived
:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
请指教。
注意:这是一个人为的示例,使用 Microsoft.Extensions.Configuration 中的配置对象从更复杂的类层次结构简化而来,其中多个级别的类都需要访问配置。
是不是代码写错了?
是的,这是错误的。
string name
在主构造函数中只是一个参数,但是当您在封闭类型中使用它时,编译器会自动将其转换为私有字段,因此您在类中创建了一个附加私有字段Derived
,而实际上name
在语句中Console.WriteLine("Derived: " + name);
并没有引用基类中的字段。(换句话说,如果你有一个name
在Base
类中发生变化的方法,Derived.Test
则不会改变)
为了避免编译器自动生成意外的字段,您需要照常将参数分配给字段或属性,并且不要在派生类中使用此参数。
也许使用财产?无论如何,您可能希望将您的字段保密。
public class Base(string name)
{
protected string Name => name;
protected void Log() => Console.WriteLine("Base: " + Name);
}
public class Derived(string name) : Base(name)
{
public void Test()
{
base.Log();
Console.WriteLine("Derived: " + Name);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1898 次 |
最近记录: |