是否有必要从扩展方法中抛出NullReferenceException?
如果我定义一个扩展方法,如下所示:
static public String ToTitleCase(this string instance, CultureInfo culture) { if (instance == null) throw new NullReferenceException(); if (culture == null) throw new ArgumentNullException("culture"); return culture.TextInfo.ToTitleCase(instance); }
我是否有必要检查字符串实例是否为null并自己抛出空引用exception? 或者CLR在这种情况下是否像实例方法一样处理扩展方法并为我处理检查/抛出?
我知道扩展方法只是静态方法的语法糖,也许C#编译器在编译时添加了检查? 请澄清 :)
不。您不应该手动抛出NullReferenceException
。 它应该只被框架本身抛出。
在这种情况下,您应该为instance
和culture
抛出ArgumentNullException
:
static public String ToTitleCase(this string instance, CultureInfo culture) { if (instance == null) throw new ArgumentNullException("instance"); if (culture == null) throw new ArgumentNullException("culture"); return culture.TextInfo.ToTitleCase(instance); }
从NullReferenceException
文档 :
请注意,应用程序抛出
ArgumentNullException
exception,而不是此处讨论的NullReferenceException
exception。
它肯定不是。 然而,“快速失败”,有些人忘记……“失败”。 但是,我认为不抛出ArgumentNullException(辩论与NullReferenceException留给其他post)的原因是有限的,并且通常与过于聪明有关:-)一个假设的用例可能是IsNullOrEmpty
。 只要它实际上有用,并使代码更清洁:去吧。
没有来自CLR的支票。 就运行时而言,它只是将一个(可能为null)参数传递给静态方法。 其余的是糖 – 并且没有任何糖涉及添加额外的空检查 🙂
快乐的编码。
- 找不到方法’Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(Boolean)
- HttpClient PostAsync发布空内容
- 在UWP中使用基于CMS的格式签名数据
- 大型多维数组(Jagged Array)C#的解决方法?
- #If DEBUG被忽略(VB.net或C#)
- 使用File.Exists检查64位系统上是否存在文件
- 线程睡眠在Windows Phone7上运行不正常
- Scaffolding EntityFramework 6无法将’System.Data.Entity.Core.Objects.ObjectContext’类型的对象强制转换为’System.Data.Objects.ObjectContext’
- 为什么Add-Migration有时会创建重复的迁移?