该方法是使用 null 值调用还是给出 null 引用异常?
MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?
如果是这种情况,我将永远不需要检查我的“this”参数是否为 null?
这将正常工作(无例外)。扩展方法不使用虚拟调用(即它使用 “call” il 指令,而不是 “callvirt”),因此除非您在扩展方法中自己编写它,否则没有空检查。这在少数情况下实际上很有用:
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
public static void ThrowIfNull<T>(this T obj, string parameterName)
where T : class
{
if(obj == null) throw new ArgumentNullException(parameterName);
}
等
从根本上说,对静态调用的调用是非常字面的——即
string s = ...
if(s.IsNullOrEmpty()) {...}
成为:
string s = ...
if(YourExtensionClass.IsNullOrEmpty(s)) {...}
显然没有空检查的地方。
马克·格拉维尔正确答案的补充。
如果 this 参数明显为 null,您可能会收到编译器的警告:
default(string).MyExtension();
在运行时运行良好,但会产生警告。"Expression will always cause a System.NullReferenceException, because the default value of string is null"
正如您已经发现的那样,由于扩展方法只是美化的静态方法,因此它们将通过传入的引用进行调用,而不会被抛出。但是,由于它们看起来像调用方的实例方法,因此它们也应该像这样运行。然后,大多数情况下,您应该检查参数并在 .如果该方法显式处理值并且其名称正确指示它,则可以不执行此操作,如以下示例所示:null
NullReferenceException
this
null
null
public static class StringNullExtensions {
public static bool IsNullOrEmpty(this string s) {
return string.IsNullOrEmpty(s);
}
public static bool IsNullOrBlank(this string s) {
return s == null || s.Trim().Length == 0;
}
}
前段时间我也写了一篇关于这个的博客文章。
模板简介:该模板名称为【在 C# 中,在 null 对象上调用扩展方法时会发生什么情况?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。