} 有些静态代码检查工具也许可以根据这里的参数判断代码块来认定为此处的参数不能为 null,但这种判断代码无处不在,静态检查工具如何能够有效地捕获每一处的检查呢?难道我们真的要去翻阅文档吗?...image.png ▲ 手动生成 ReSharper Annotations ReSharper 中常用的契约 Attribute CanBeNull 表示参数或返回值可能为 null。...ItemCanBeNull 表示集合参数或集合返回值里某一项可能为 null。 ItemNotNull 表示集合参数或集合返回值里每一项都不为 null。...LocalizationRequired 表示参数字符串需要被本地化。 NotNull 表示参数或返回值不可能为 null。...或者,这样用普通的抛异常的方式。如果使用普通方式抛出异常,需要遵循 if-then-throw 的模式,即有问题立刻就抛出异常。例如下面对 null 的判断就符合这样的模式。
使用错误 ArgumentException 表示参数使用错了 ArgumentNullException 表示参数不应该传入 null ArgumentOutOfRangeException...表示参数中的序号超出了范围 InvalidEnumArgumentException 表示参数中的枚举值不正确 InvalidOperationException 表示当前状态下不允许进行此操作(也就是说存在着允许进行此操作的另一种状态...,真的不要抛出此异常,因为它本身不包含异常信息,让使用者很难正确 catch 这样的异常。...但是,当拿着这样的异常去调查哪里错了的时候,我们会发现 demo 和 anotherDemo 都可能为 null。...如果在方法的一开始就抛出使用异常 ArgumentNullException,那么就可以向使用者报告这样的参数使用错误。
_version看字面意思是版本,具体用处下面看,与遍历集合时经常碰到的集合被修改异常有关。...(IEnumerable collection) 2 { 3 if (collection == null) 4 throw new ArgumentNullException...List可以修改,就可以把参数设成IReadOnlyList。...,比如在foreach里remove或add元素就会导致这个异常。...List通过version来跟踪集合是否发生改变,如果在foreach遍历时发生改变则抛出异常。
ArgumentNullException"> 为 null。...ArgumentNullException">items"/> 为 null。...如果集合中不包含类型 的对象,则返回类型的默认值:如果是引用类型,默认值为 null;如果是值类型,默认值为 0。...ArgumentNullException"> 为 null。...类型参数可以作为方法的参数,作为方法的返回值,或者作为方法内部定义的一个局部变量来使用。CLR允许一个方法指定它独有的类型参数,这些类型参数可用于参数、返回值、或者局部变量。
ArgumentNullException 就是一个不错的替代异常,说它好因为有两点: 在错误发生的最开始就报告了错误,避免错误的蔓延。...因为 SetValue 中发生了异常后,获取到的调用栈是导致 _value 为 null 的调用栈。 告知了为 null 的参数名称。...靠以上两点,当发生异常时,我们能唯一确定 _value 为 null 的原因,而这才是本质错误。 可是,如果并不是参数问题导致了 null,那我们还能用什么异常呢?...所以,为了解决这些困惑,我建议在开发中以如下方式对待我们的 null: 对任何可被外部模块调用的方法的参数进行 null 判断,并在参数为 null 时抛出 ArgumentNullException。...C# 8.0 极有可能为我们带来“可空引用类型”或者“非空引用类型”;如果真的带来了,这将比 JetBrains.Annotations 拥有更大的强制性,帮助我们避免出现意外的 null 引用,帮助我们在可能为
值 规则 ID CA1062 类别 设计 修复是中断修复还是非中断修复 非中断 原因 外部可见方法取消引用其中一个引用参数,而不验证该参数是否 null(Visual Basic 中 Nothing)...可以将此规则配置为从分析中排除某些类型和参数。 还可以指示 null 检查验证方法。 规则说明 对于传递给外部可见方法的所有引用参数,都应检查其是否为 null。...如果需要,则在参数为 null 时引发 ArgumentNullException。 如果某个方法由于被声明为公共或受保护而可以从未知程序集进行调用,则应验证该方法的所有参数。...发生冲突的原因是,传递到复制构造函数的所复制对象可能为 null(在 Visual Basic 中为 Nothing)。...在下面的 Person 类示例中,传递给 Person 复制构造函数的 other 对象可能为 null。
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
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。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
Null值检查应该算是开发中最常见且烦人的工作了吧,有人反对吗?反对的话请右上角关门不送。这篇文章就教大家一招来简化这个烦人又不可避免的工作。...罗嗦话不多说,先看下面一段简单的不能再简单的null值判断代码: public void DoSomething(string message) { if(message == null)...throw new ArgumentNullException(); // ... } 方法体的每个参数都将用if语句进行检查,并逐个抛出 ArgumentNullException...的异常。...关注我的朋友,应该看过我上篇《一个小技巧助您减少if语句的状态判断》的文章,它也是简化Null值判断的一种方式。
相应的还有一个Assert.DoesNotContain()方法, 测试集合是否不包含某个元素....所以应该使用Assert.ThrowsArgumentNullException>(...)方法来Assert是否抛出了特定类型的异常....); // 这个会失败 Assert.ThrowsArgumentNullException>(() => factory.Create(null)); } 注意不要直接运行会抛出异常的代码...(null)); } 这里就是说异常里应该有一个叫name的参数....ex = Assert.ThrowsArgumentNullException>(() => factory.Create(null)); Assert.Equal("name
从失败信息可以看到期待值和实际值。...Assert Null值 [Fact] public void NotHaveNameByDefault() { var plumber...所以应该使用Assert.ThrowsArgumentNullException>(...)方法来Assert是否抛出了特定类型的异常....); // 这个会失败 Assert.ThrowsArgumentNullException>(() => factory.Create(null)); } 注意不要直接运行会抛出异常的代码...)); Assert.ThrowsArgumentNullException>("name", () => factory.Create(null)); } 这里就是说异常里应该有一个叫
// // System.ArgumentNullException: // path 参数为 null。...// // System.ArgumentNullException: // path 参数为 null。...// // System.ArgumentNullException: // destinationFileName 参数为 null。...// // System.ArgumentNullException: // destinationFileName 参数为 null。...// // System.ArgumentNullException: // fileSecurity 参数为 null。
如果指定的是一个变量(或者参数),捕获到的就是变量名。比如我们定义了如下这个用来验证参数并确保它不能为Null的ArgumentNotNull。...除了第一个表示参数值的argumentValue参数,它还具有一个表示参数名的argumentName参数,抛出的ArgumentNullException异常的参数名就来源于此。...) throw new ArgumentNullException(argumentName); return argumentValue; } } 我们修改了Invoker的构造函数...,并按照如下的方式添加了针对输出参数(ActivitySource对象)的验证,以避免后续抛出NullReferenceException异常。...作为参数,此时会抛出如下的异常,可以看到抛出的ArgumentNullException异常被赋予了正确的参数名。
HttpsRedirectionOptions { public int RedirectStatusCode { get; set; } = 307;// 用于设置重定向时的状态码,默认值307...) throw new ArgumentNullException(nameof (provider)); if (purposes == null) throw...) throw new ArgumentNullException(nameof (provider)); if (purpose == null) throw...) throw new ArgumentNullException(nameof (services)); if (purposes == null) throw...) throw new ArgumentNullException(nameof (services)); if (purpose == null) throw
所以应该使用Assert.ThrowsArgumentNullException>(...)方法来Assert是否抛出了特定类型的异常....); // 这个会失败 Assert.ThrowsArgumentNullException>(() => factory.Create(null)); } 注意不要直接运行会抛出异常的代码...(null)); Assert.ThrowsArgumentNullException>("name", () => factory.Create(null));...} 这里就是说异常里应该有一个叫name的参数....ex = Assert.ThrowsArgumentNullException>(() => factory.Create(null)); Assert.Equal("name
// 创建参数名称,如果不存在,只抛出一个异常....// 如果存在和参数名称相同的列,则将列值赋给当前名称的参数....,如果不匹配,抛出一个异常....= parameterValues.Length) { throw new ArgumentException("参数值个数与参数不匹配.");...SqlCommandBuilder.DeriveParameters(cmd); connection.Close(); // 如果不包含返回值参数,将参数集中的每一个参数删除
// 异常:System.ArgumentNullException:httpContext 参数为 null。...// 异常: System.ArgumentNullException: //filterContext 参数为 null。...// 异常:System.ArgumentNullException: // httpContext 参数为 null。...Html.Encode,Html.AttributeEncode,Url.Encode 3)对Js进行编码 使用Ajax.JavaScriptStringEncode 4)将AntiXSS库作为默认的编码器(不建议使用...,每次执行控制器操作前,都会验证隐藏栏位和浏览器cookie中的值是否相同,只有相同才允许执行控制器操作。
if (basePath == null) { throw new ArgumentNullException(nameof(basePath))...} return builder.SetFileProvider(new PhysicalFileProvider(basePath)); } 简单的参数校验...当在PhysicalFileProvider中调用FileWatcher实例时会调用CreateFileWatcher()方法,这个在多线程中表现很好,不会重复初始化Watcher对象. ok,到这里先不介绍...}); } } ok,到这里很清晰了,如果sonConfigurationSource实例中的ReloadOnChange参数设为...调用了System.Text.Json序列化了文件的内容,并以字典的形式输出.并给ConfigurationProvider的Data属性赋值至于为什么可以通过IConfigurationRoot拿到配置值,
); } catch (HttpRequestException e) { // 请自己处理网络异常...class Qpush { public Qpush(string name, string code) { if (name == null...) throw new ArgumentNullException(nameof(name)); if (code == null) throw new ArgumentNullException...("name 不能为空"); } if (string.IsNullOrEmpty(code)) {...throw new ArgumentNullException("code 不能为空"); } Name = name; Code
属性初始值设定项 属性初始值设定项允许我们在声明属性时设置属性的默认值。在 C# 12 中,我们现在可以使用构造函数来初始化属性,从而更轻松地设置复杂对象。...throw new ArgumentNullException(nameof(parameter1)); parameter2! ??...运算符用于在继续执行方法逻辑的其余部分之前对parameter1 和parameter1 参数进行 null 检查。...如果任一参数为 null,则会抛出一个 ArgumentNullException,并将参数名称作为异常消息。 注意。 在参数名称后使用 “!” 运算符,告知编译器参数在代码中的值不为 null。...如果参数为 null,则执行 throw 语句,并且该方法立即退出而不执行任何进一步的逻辑。
领取专属 10元无门槛券
手把手带您无忧上云