C# 7 中的 Throw 表达式
介绍
异常是程序中违反系统或应用程序约束的运行时错误,或者是程序正常执行期间不应发生的情况。异常的可能原因包括尝试连接到不再存在的数据库、程序试图将数字除以零或打开损坏的 XML 文件。当发生这些情况时,系统会捕获错误并引发异常。捕获异常是一种处理这些意外错误的方法,方法是定义在引发异常时运行的代码块。
C# 7 附带了一项功能,允许我们从表达式体成员、空合并表达式和条件表达式中抛出异常。在本指南中,我将向您展示如何使用抛出表达式。
从异常中抛出异常
让我们看一个类的例子以及它如何在抛出异常之前验证业务规则。
using System;
namespace MyApp
{
class Account
{
public Account(string name, int balance)
{
if (name == null)
{
throw new ArgumentNullException(nameof(name));
}
Name = name;
Balance = balance;
}
public string Name { get; private set; }
public int Balance { get; private set; }
public bool IsBlocked { get; set; }
public string GetLastName()
{
var parts = Name.Split(' ');
if (parts.Length < 2)
{
throw new InvalidOperationException("Invalid name!");
}
return parts[1];
}
public void Credit(int amount)
{
if (IsBlocked)
{
throw new InvalidOperationException("The transaction cannot be performed on a blocked account");
}
Balance = amount + Balance;
}
public void Debit(int amount)
{
if (IsBlocked)
{
throw new InvalidOperationException("The transaction cannot be performed on a blocked account");
}
Balance = Balance - amount;
}
}
}
上面的类具有属性Name、Balance和IsBlocked。我们在代码中的一些地方使用了throw语句来引发异常。在构造函数中,它检查Name属性是否为null。如果为 null ,则抛出异常。如果Name属性中的值不包含两个由空格分隔的名称,则GetLastName方法会引发InvalidOperationException异常。同样,如果帐户被标记为已阻止, Credit和Debit方法都会引发异常。我们可以通过从表达式中抛出这些异常来缩短代码的长度。
为了重构构造函数,我们将删除if语句并将其替换为空合并运算符,然后从表达式中应用throw语句,如下所示:
public Account(string name, int balance)
{
Name = name ?? throw new ArgumentNullException(nameof(name));
Balance = balance;
}
同样,我们也可以从三元运算符中抛出异常。我们可以将其应用于GetLastName、Debit和Credit方法,如下所示:
public string GetLastName()
{
var parts = Name.Split(' ');
return parts.Length > 1 ? parts[1] : throw new InvalidOperationException("Invalid name!");
}
public void Debit(int amount)
{
Balance = IsBlocked ? throw new InvalidOperationException("The transaction cannot be performed on a blocked account") : (Balance - amount);
}
public void Credit(int amount) => Balance = IsBlocked ? throw new InvalidOperationException("The transaction cannot be performed on a blocked account") : (amount + Balance);
方法Debit和Credit执行类似的操作,只不过一个方法从 Balance 中移除,而另一个方法添加。我们将Credit更改为表达式体方法,而Debit则保留标准方法声明。这表明我们可以将其应用于类的任何表达式体成员。例如,如果我们要定义一个不起作用的方法,以便以后可以实现它。我们可以将该表达式体方法定义为public string GetFirstName() => throw new NotImplementedException();。
总结
C# 7 引入了 throw 表达式,它允许我们从表达式中抛出异常。这适用于表达式体成员中的表达式、空合并运算符和三元运算符等条件表达式。在许多表达式可能有效的地方,可以使用 throw 表达式直接抛出异常。这是对语言的一个很好的补充,在本帖中显示的示例中,您应该注意到它可以帮助编写更少的代码。在编译时,它们被重写并用与我们在没有 throw 表达式的情况下声明它们的方式类似的代码表达。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~