标签: c#-12.0

将主构造函数参数传递给基类时如何“正确”(惯用)避免 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);
    }
}
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)

.net c# c#-12.0

21
推荐指数
2
解决办法
1898
查看次数

C# 12 中主构造函数的 Null 检查

我使用 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# fail-fast primary-constructor .net-8.0 c#-12.0

19
推荐指数
1
解决办法
1919
查看次数

in 和 ref 只读参数之间的区别

in和参数有什么区别ref readonly

我发现inref readonly参数都使参数只读,并且不能在被调用的方法中修改。它们有类似的功能吗?

c# ref c#-12.0

12
推荐指数
2
解决办法
1574
查看次数

为什么 C# 12 主构造函数以相反的顺序执行?

为什么C# 12 中的主构造函数以相反的顺序执行?

\n

至少可以说这是一个突破性的改变......

\n

例子:

\n
namespace 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)

c# constructor primary-constructor .net-8.0 c#-12.0

12
推荐指数
2
解决办法
465
查看次数

我应该在 C# 12 中为主构造函数参数创建私有属性吗?

我正在使用 C# 12。在 C# 12 中我可以使用主构造函数:

实施1:

public class Calculation(int a,int b)
{
  public int Addition() => a + b;
  public int Subtraction() => a - b;
}
Run Code Online (Sandbox Code Playgroud)

实施2:

public class Calculation(int a,int b)
{
 private int _a { get; init; } = a;
 private int _b { get; init; } = b;
 public int Addition() => _a + _b;
 public int Subtraction() => _a - _b;
}
Run Code Online (Sandbox Code Playgroud)

当我像这样调用这个方法时:

console.WriteLine(new Calculation(10,25).Addition());
Run Code Online (Sandbox Code Playgroud)

两种实现都工作正常,所以我想知道使用较长的实现 2 相对于较短的实现 1 是否有任何优势。

c# primary-constructor .net-8.0 c#-12.0

10
推荐指数
2
解决办法
1548
查看次数

集合表达式没有目标类型

使用C# 12 的新集合表达式,我无法执行以下操作:

if (["blue", "red", "foo"].Any((x) =>
{
    ...
})) 
Run Code Online (Sandbox Code Playgroud)

它给出了 CS9172 编译器错误“集合表达式没有目标类型”。["blue", "red", "foo"]我必须采用new[] { "blue", "red", "foo" }-- C# 12 之前的方式,而不是,它不必指定类型。

显然,集合表达式仅包含一种类型。是否有技术原因导致编译器无法确定类型?如果可能的话,这将是使用该新功能的一种非常简洁且有用的方式。

.net c# .net-8.0 c#-12.0

5
推荐指数
1
解决办法
366
查看次数

使用 C#12 集合表达式初始化 List<List>> 的语法是什么?

假设我有这样的代码(或任何类型的锯齿状结构):

var intListList = new List<List<int>> {
    new() { 1, 2, 3 }
};
Run Code Online (Sandbox Code Playgroud)

我想在这里使用集合表达式。Resharper (EAP) 建议这样做:

var intListList = new List<List<int>> {
    [1, 2, 3]
};
Run Code Online (Sandbox Code Playgroud)

但这不能编译。

这一定是可能的!语法是什么?

编辑:

好的。因此,从答案中,不是这样,而是在表达式中声明类型:

// does not compile
var intListList = new List<List<int>> {
    [1, 2, 3]
};
Run Code Online (Sandbox Code Playgroud)

类型必须显式声明,并且没有new()

// compiles!
List<List<int>> intListList = [[1, 2, 3]];
Run Code Online (Sandbox Code Playgroud)

c# collection-initializer .net-8.0 c#-12.0

3
推荐指数
1
解决办法
614
查看次数

C# 12 拦截器的用途

C# 12 将引入拦截器,它允许您拦截对方法的调用,但这有什么意义呢?为什么我不首先调用另一个方法呢?

为什么我想使用一个 - 语法似乎对开发人员不友好?谢谢

.net c# .net-8.0 c#-12.0

-1
推荐指数
1
解决办法
257
查看次数