c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错

如果一个对象的值为null,那么它调用扩展方法时会报错吗?

Person p = null ;
p.ExtendMethod();

上述代码出现的情况不会报错,刚开始遇到这种情况时很纳闷,就去问了大牛。大牛解释如下:

扩展函数其实只是为了让代码更具有可读性, 但最终在clr中会翻译成标准的静态函数调用,

比如:  

public static void ExtMethod(this string str)
{
    if(!string.IsNullOrEmpty(str))
    {
         //对str处理
    }
}

调用  "string".ExtMethod()最终会翻译成ExtMethod("string"); 所以即使为null自然也不会报错

null 为什么点不出那个扩展函数?


  通过null获取它自己的方法如下:

  

  这样试试 ((string)null).ExtMethod() 肯定能点出来

  

  关键是使用扩展函数要看对应的数据类型。

原文地址:https://www.cnblogs.com/yanglang/p/9586135.html

时间: 2024-07-30 09:34:08

c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错的相关文章

原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法

网上看了好多java直接打印一个对象时,直接调用该类的toString方法 . 但是: Object obj=null; System.out.println(obj);//没有报错 System.out.println(obj.toString());//报空指针异常 System.out.println(obj);既然也是直接调用toString方法,为什么不报错??? 原因总结如下: 1.调用Object类的toString方法,必须保证object不是null值,否则将抛出NullPoi

ognl.OgnlException: target is null for setProperty(null, "login", [Ljava.lang.String;@133cdbd) 国际化时,登录按钮报错

虽然不影响程序运行,但是会报错警告 警告: Error setting expression 'html.login' with value '[Ljava.lang.String;@133cdbd'ognl.OgnlException: target is null for setProperty(null, "login", [Ljava.lang.String;@133cdbd) 登录代码 <s:submit id="login" key="h

ios 解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为&lt;null&gt;无法保存在userDefault的问题

解决数据请求json解析字典后,由于java某些类库转换json字符串后出现键值为<null>无法保存在userDefault. 打印下得到的字典数据: “username”=<null> 此时如果将字典保存到userDefault中会报错 所以需要遍历字典将其替换 for (NSString*s in [Dict1 allKeys]) { if ([Dict1[s] isEqual:[NSNull null]]) { [Dict1 setObject:@""

解决:mysql timestamp默认值0000-00-00 00:00:00 报错

一. 问题的引出 我们在用mysql5.7创建表时,如果把timestamp(时间戳)的默认值设置为0000-00-00 00:00:00 的形式,将会产生一条报错: `RepaymentDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '回款日期', 报错信息如下: [Err] 1067 - Invalid default value for 'RepaymentDate' 二. 找出原因 这个问题和mysql中sql

空对象模式和扩展方法的NULL验证

using System;using System.Collections.Generic;using System.Linq;using System.Text;//空对象模式和扩展方法的NULL验证namespace Chap2_3{ public class NULLObject { public void Test() { Promation promation = PromationFactory.Create("水果促销"); Promation promation1 =

java中,只声明一个对象不赋值,与声明一个对象并赋为 null 的区别

比如: public MainGame   mMainGame ; 与 public MainGame   mMainGame = null;这两句的区别? 编译的时候会不同,未赋值,直接使用编译时会报错. 不赋值就不会分配空间,赋值null会分配0大小的初始空间. 局部变量要赋初始值,全局变量不需要赋初始值:还有int a=null;这句,应该是Integer a=null; 如果在类中声明变量可以不赋值,构造对象时会获得默认值 如果在方法中声明变量,必须赋初始值 作为成员变量来说 int a

值为NULL的对象指针

相信大家对NULL不会很陌生,NULL 是一个标准规定的宏定义,用来表示空指针常量,当一个指针变量被赋值为NULL时,表示它不再指向任何有效地址,无法在访问任何数据.在VS2012库文件stdio.h中有如下定义: 1 #ifdef __cplusplus 2 #define NULL 0 3 #else 4 #define NULL ((void *)0) NULL经常被用作指针初始化行为,以及free/delete某一指针后对其的赋值操作,这都是我们所鼓励的一些好的习惯操作.在对NULL指针

struts下ajax提交与页面进行提示 返回值为null

@Override    public String execute() throws Exception {        if ("none".equals(task)) {            HttpServletResponse response = ServletActionContext.getResponse();            response.setContentType("text/html;charset=GBK"); PrintW

刚学Android遇到的问题,findViewById值为null(新版本),老鸟欢迎你的指正

环境交代: 刚学Android,在官网下载的新版的ADT 以及新版的SDK 在新版的IDE(ADT)创建项目时如果你的最小版本(minimum required SDK)要支持4.0以下版,并且目标版本为(4.0+).那么此时IDE会为你创建一个兼容包 (appcompat_v7)如下图, 创建发短信项目后就会有如下的项目目录结构 这个时候在生成的项目主Activity不是以前的那种继承的Activity,而是继承的ActionBarActivity,我把发短信的界面创建起.界面效果如下.点此时