在 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
{ …Run Code Online (Sandbox Code Playgroud) 我使用 C# 12。在 C# 12 中我可以使用主构造函数:
public class UserService(IUnitOfWork uow) : IUserService
{
}
Run Code Online (Sandbox Code Playgroud)
在 C# 12 之前,我对构造函数中注入的项使用 null 检查:
public class UserService : IUserService
{
private readonly IUnitOfWork _uow;
public UserService(IUnitOfWork uow)
{
ArgumentNullException.ThrowIfNull(uow);
_uow = uow;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我如何在 C# 12 中进行 null 检查?
是否需要对主构造函数使用快速失败?
为什么C# 12 中的主构造函数以相反的顺序执行?
\n至少可以说这是一个突破性的改变......
\n例子:
\nnamespace Whatever;\n\n[TestClass]\npublic class UnitTestTemp\n{\n [TestMethod]\n public void TestMethod1() // PASS // is expected, 1st is 1, 2nd is 2\n {\n using var stream = new MemoryStream(new byte[] { 1, 2, 3, 4 });\n\n var classicDerived = new ClassicDerived(stream);\n\n Console.WriteLine(classicDerived.Value1);\n Console.WriteLine(classicDerived.Value2);\n\n Assert.AreEqual(1, classicDerived.Value1);\n Assert.AreEqual(2, classicDerived.Value2);\n }\n\n [TestMethod]\n public void TestMethod2() // FAIL // is opposite, 1st is 2, 2nd is 1\n {\n using var stream = new MemoryStream(new byte[] { …Run Code Online (Sandbox Code Playgroud)