我正在学习 C# 并试图处理涌入的“a可能是null”警告。
我想知道,由于当某些内容为空时,通过从函数返回或抛出异常而出错是一种常见的情况,C# 是否有某种针对这种情况的语法糖?
我的想法的示例:(int a = obtainA() ??? { Console.WriteLine("Fatal error;") return };这不是真正的代码)
我了解??和??=运算符,但它们似乎没有多大帮助,而且我还没有找到更好的。
如果不是,我们最接近模仿的是什么?难道没有比写下面更好的方法了吗?
int? nullableA = obtainA();
int a;
if (nullableA.HasValue) {
a = nullableA.Value;
}
else {
Console.WriteLine("Fatal error");
return;
}
/* use a, or skip defining a and trust the static analyzer to notice nullableA is not null */
Run Code Online (Sandbox Code Playgroud)
??从 C# 7 开始,可以使用该语言版本中引入的throw 表达式通过运算符实现“or_throw” :
int? i = null;
int j = i ?? throw new Exception();
Run Code Online (Sandbox Code Playgroud)
另一种抛出方法可以通过以下方式实现ArgumentNullException.ThrowIfNull:
#nullable enable
int? i = null;
ArgumentNullException.ThrowIfNull(i);
int j = i.Value; // no warning, compiler determines that i can't be null here
Run Code Online (Sandbox Code Playgroud)
您还可以编写自己的方法,支持可空流分析(就像ArgumentNullException.ThrowIfNull这样做),并使用由 C# 编译器解释的空状态静态分析的属性:
#nullable enable
int? i = null;
if (IsNullAndReport(i)) return;
int j = i.Value; // no warning, compiler determines that i can't be null here
bool IsNullAndReport([NotNullWhen(false)]int? v, [CallerArgumentExpression(nameof(i))] string name = "")
{
if (v is null)
{
Console.WriteLine($"{name} is null;");
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
以及模式匹配方法:
int? i = null;
if (i is { } j) // checks if i is not null and assigns value to scoped variable
{
// use j which is int
}
else
{
Console.WriteLine("Fatal error");
return;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |