Guard 子句是一个简单而强大的工具,用于确保在继续执行实际业务逻辑之前提供给方法的参数有效。它们有助于防止臭名昭著的 “箭头代码” (嵌套的 if 语句),并使您的代码更简洁、更易于维护。
在本文中,我们将探讨如何在 .NET 中创建自定义保护子句,以有效地处理各种常见的验证方案。
什么是保护子句?
Guard 子句是放置在函数开头的条件检查,用于验证输入参数。如果不满足条件,函数会提前退出,通常是通过引发异常。这种方法有助于保持代码干净并防止深度嵌套。
了解术语“保护条款”:您的问题解答
Q: 为什么叫 “guard” 子句?
**一个:**使用术语 是因为它通过确保无效数据不会通过来 “保护” 方法的完整性,从而保护后面的逻辑。它只允许有效的输入继续进行,从而防止代码中进一步出现错误或意外行为。guard
问:这些条款是否可以称为 “” 而不是 “guard”?
**一个:**虽然你可以给他们起这样的名字,但 “guard” 一词特意传达了防止坏事及早发生的想法。 通常意味着检查正确性,但也意味着采取措施,例如在条件不满足时引发异常。这为这种保护性、防御性行为提供了一个更合适的术语。
没有 guard 子句的示例
让我们考虑一个场景,我们需要创建一个需要非空名称和正 age 的类。
public class Student
{
public string Name { get; private set; }
public int Age { get; private set; }
public Student(string name, int age)
{
if (string.IsOrWhiteSpace(name))
{
throw new ArgumentException("Name cannot be , empty, or whitespace.", nameof(name));
}
if (age <= 0)
{
throw new ArgumentOutOfRangeException(nameof(age), "Age must be a positive integer.");
}
Name = name;
Age = age;
}
}
虽然这种方法有效,但如果您需要在多个方法或类中添加类似的检查,它可能会变得乏味。这就是自定义保护子句发挥作用的地方。
创建自定义保护子句
为了使我们的代码更具可重用性和可维护性,我们可以创建一个具有常见验证方法的 类。这将允许我们用一行代码替换重复的验证逻辑。
public static class Ensure
{
public static void NotOrWhiteSpace(string value, string parameterName)
{
if (string.IsOrWhiteSpace(value))
{
throw new ArgumentException($"{parameterName} cannot be , empty, or whitespace.", parameterName);
}
}
public static void Positive(int value, string parameterName)
{
if (value <= 0)
{
throw new ArgumentOutOfRangeException(parameterName, $"{parameterName} must be a positive integer.");
}
}
}
重构类
有了自定义 guard 子句,我们现在可以重构类以使用这些方法。
使用 Guard 子句的好处扩展 Guard 子句
您可以扩展该类以处理其他常见的验证方案,例如检查 对象、验证范围、确保集合不为空等。
下面是扩展类以验证范围的示例。
public static class Ensure
{
public static void InRange(int value, int min, int max, string parameterName)
{
if (value < min || value > max)
{
throw new ArgumentOutOfRangeException(parameterName, $"{parameterName} must be between {min} and {max}.");
}
}
}
通过将通用验证逻辑抽象为可重用的方法,您可以编写更简洁、更易于维护的代码。下次您发现自己重复编写相同的验证逻辑时,请考虑创建自定义 guard 子句来简化您的代码库。
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666