首页 > C# > 在 C# 中,在 null 对象上调用扩展方法时会发生什么情况?

在 C# 中,在 null 对象上调用扩展方法时会发生什么情况?

上一篇 下一篇

该方法是使用 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"

分割线

网友回答:

正如您已经发现的那样,由于扩展方法只是美化的静态方法,因此它们将通过传入的引用进行调用,而不会被抛出。但是,由于它们看起来像调用方的实例方法,因此它们也应该像这样运行。然后,大多数情况下,您应该检查参数并在 .如果该方法显式处理值并且其名称正确指示它,则可以不执行此操作,如以下示例所示:nullNullReferenceExceptionthisnullnull

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#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 268次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-22
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
响应式 微信文章 微信素材 自适应 微信图片 企业网站 微信模板 单页式简历模板 html5 微信公众平台
您可能会喜欢的其他模板