首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#.NET 中的契约

} 有些静态代码检查工具也许可以根据这里的参数判断代码块来认定为此处的参数不能为 null,但这种判断代码无处不在,静态检查工具如何能够有效地捕获每一处的检查呢?难道我们真的要去翻阅文档吗?...image.png ▲ 手动生成 ReSharper Annotations ReSharper 中常用的契约 Attribute CanBeNull 表示参数或返回值可能为 null。...ItemCanBeNull 表示集合参数或集合返回值里某一项可能为 null。 ItemNotNull 表示集合参数或集合返回值里每一项都不为 null。...LocalizationRequired 表示参数字符串需要被本地化。 NotNull 表示参数或返回值不可能为 null。...或者,这样用普通的抛异常的方式。如果使用普通方式抛出异常,需要遵循 if-then-throw 的模式,即有问题立刻就抛出异常。例如下面对 null 的判断就符合这样的模式。

93610

应该抛出什么异常?不应该抛出什么异常?(.NETC#)

使用错误 ArgumentException 表示参数使用错了 ArgumentNullException 表示参数不应该传入 null ArgumentOutOfRangeException...表示参数中的序号超出了范围 InvalidEnumArgumentException 表示参数中的枚举值不正确 InvalidOperationException 表示当前状态下不允许进行此操作(也就是说存在着允许进行此操作的另一种状态...,真的不要抛出此异常,因为它本身不包含异常信息,让使用者很难正确 catch 这样的异常。...但是,当拿着这样的异常去调查哪里错了的时候,我们会发现 demo 和 anotherDemo 都可能为 null。...如果在方法的一开始就抛出使用异常 ArgumentNullException,那么就可以向使用者报告这样的参数使用错误。

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    NullReferenceException,就不应该存在!

    ArgumentNullException 就是一个不错的替代异常,说它好因为有两点: 在错误发生的最开始就报告了错误,避免错误的蔓延。...因为 SetValue 中发生了异常后,获取到的调用栈是导致 _value 为 null 的调用栈。 告知了为 null 的参数名称。...靠以上两点,当发生异常时,我们能唯一确定 _value 为 null 的原因,而这才是本质错误。 可是,如果并不是参数问题导致了 null,那我们还能用什么异常呢?...所以,为了解决这些困惑,我建议在开发中以如下方式对待我们的 null: 对任何可被外部模块调用的方法的参数进行 null 判断,并在参数为 null 时抛出 ArgumentNullException。...C# 8.0 极有可能为我们带来“可空引用类型”或者“非空引用类型”;如果真的带来了,这将比 JetBrains.Annotations 拥有更大的强制性,帮助我们避免出现意外的 null 引用,帮助我们在可能为

    1.1K10

    CA1062:验证公共方法的参数

    值 规则 ID CA1062 类别 设计 修复是中断修复还是非中断修复 非中断 原因 外部可见方法取消引用其中一个引用参数,而不验证该参数是否 null(Visual Basic 中 Nothing)...可以将此规则配置为从分析中排除某些类型和参数。 还可以指示 null 检查验证方法。 规则说明 对于传递给外部可见方法的所有引用参数,都应检查其是否为 null。...如果需要,则在参数为 null 时引发 ArgumentNullException。 如果某个方法由于被声明为公共或受保护而可以从未知程序集进行调用,则应验证该方法的所有参数。...发生冲突的原因是,传递到复制构造函数的所复制对象可能为 null(在 Visual Basic 中为 Nothing)。...在下面的 Person 类示例中,传递给 Person 复制构造函数的 other 对象可能为 null。

    72630

    DDD - Domain Primitive

    if (name == null) throw new ArgumentNullException(nameof(name)); if (phone =...//参数校验 if (name == null) throw new ArgumentNullException(nameof(name)); if (phone == null) throw new...比如改造成下面这个样子,这样做虽然解决了一些问题但不算是一种最佳实践,因为他还存在两个缺点: 1.业务方法内还是需要主动调用工具类来进行校验,如果校验失败需要抛出异常,这样在业务方法中把参数异常和业务异常逻辑混合了起来不太合理...修改目标: 1.接口语义明确,可拓展性强,最好带有自检性 2.参数校验逻辑复用,内聚 3.参数校验异常和业务逻辑异常接口 在最上面的接口示例中,接口语义不明确使用了多个相同基本类型(string)的参数可扩展性不强的原因是使用了基本类型和参数个数也写死了...这样接口就只会接收到通过校验的参数,这样做还有一个好处就是自然而然的将参数校验异常于业务逻辑异常区分开来,比如我们可以将方法签名改造成这个样子: public User Register(string

    44510

    int32.parse什么意思_integer.parseint和valueof

    When s is a null reference, it will throw ArgumentNullException....唯一不同的是如果参数是null引用返回0,而Int32.Parse抛出ArgumentNullException。如果str不是整数值,抛出FormatException。...当参数是null引用时,返回0,而不是像前两个方法一样抛出ArgumentNullException 。如果参数不是整数,out 变量将是0,而不是抛出FormatException 。...如果你有字符串,如果期待总是返回整数,则使用Int32.Parse;如果期待除了整数还返回其他值,则用Convert.ToInt32。如果不想碰到异常,就使用Int32.TryParse。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    57630
    领券