我发现了一段用 C# 编写的代码,貌似是 8.0 版。在代码中,在调用方法之前有一个感叹号。这部分代码是什么意思,最重要的是,它的用途是什么?
var foo = Entity!.DoSomething();
Run Code Online (Sandbox Code Playgroud) 我最近看到了以下代码:
public class Person
{
//line 1
public string FirstName { get; }
//line 2
public string LastName { get; } = null!;
//assign null is possible
public string? MiddleName {get; } = null;
public Person(string firstName, string lastName, string middleName)
{
FirstName = firstName;
LastName = lastName;
MiddleName = middleName;
}
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
MiddleName = null;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我试着深入研究新的c#8功能.其中之一是NullableReferenceTypes.实际上已经有很多关于它的文章和信息.例如,这篇文章非常好.但是我找不到关于这个新陈述的任何信息null!
有人可以向我提供解释吗?为什么我需要使用它?又什么区别line1和line2?
这是我在这里的第一个问题。我在 C# 中遇到了这样的方法:
void Do(string action!) { ... }
Run Code Online (Sandbox Code Playgroud)
不要明白!后面action是什么,它确实如此。你能帮我理解一下吗?
在 C# 8.0 中,假设我<Nullable>enable</Nullable>在 .csproj 中启用了可空引用。当我尝试在不可为空的用法中使用可能为空的引用时,这给了我警告,这很好。然后我可以打开<WarningsAsErrors />并将其严格执行为错误而不是警告。
所以我希望这种语言结构可以避免某些空检查代码。具体来说,我(和许多其他人)经常写这样的方法:
public string Message { get; set; }
public void SetFoo(string message) {
Message = message ?? throw new ArgumentNullException(nameof(message));
Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)
我希望放弃空检查,因为引用是不可为空的,而是写
public string Message { get; set; }
public void SetFoo(string message) {
Message = message;
Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)
这似乎很好,因为像这样的调用会myThing.SetFoo(null);生成编译器警告/错误。但是,我发现诸如myThing.SetFoo(null!);编译和运行之类的代码无论如何都可以!因此,为了进行防御性编码,无论如何我都需要保留旧的保护条款,以防有人滥用!运算符来调用它,对吗?
有什么方法可以避免编写代码来检查不可为空的引用是否为空? 我希望有一种方法可以让编译器推断它在这种情况下应该抛出异常,而不仅仅是忽略不可为空性,但我没有看到。