在此之前,我们先看一段程序:
class Program
    {
        static void Main(string[] args)
        {
            Children children = new Children();

SetInstanceNull(children);

if (children == null)
            {
                Console.WriteLine("children is null");
            }
            else
            {
                Console.WriteLine(children.inter);
            }

Console.Read();
        }

static void SetInstanceNull(Children childrenParam)
        {
            childrenParam.inter = 10;
            childrenParam = null;
        }
    }
   
    class Children
    {
        public int inter = 0;
    }

程序输出结果:10

问题解析:

们知道方法参数如果是引用类型的话,则方法调用时,将把实例对象的地址传递给方法参数,这样在被调用方法中就可以通过实例对象的地址来操作实例对象的数
据。故在SetInstanceNull方法中我们能将children实例中inter成员的值改更为10。然而childrenParam =
null语句却没有使children为null,而仅仅是把childrenParam值为null。有人说children和
chilrenParam是两个不同的变量,所以才有这样的结果。的确,这种原因的产生是因为他们是两个不同的变量导致的,但为什么不同呢?如果我们用
object.ReferenceEquals方法去验证两个变量的相等性的话,我们会发现结果是相等的。那这个相等一定表示这两个变量相同吗?答案是否
定的。在C#里面,当初始化一个类的时候,系统将使所有的引用引用类型参数引用为空,当遇到实例化一个类的时候,例如:new
Children(),系统会在堆上分配一个内存空间存放Children实例,并将该地址返回给引用参数children。这种其实就是指针了。这样引
用参数children与刚才实例化的Children实例就建立了一一映射关系。当调用方法SetInstanceNull时,系统将children
参数的引用复制给childrenParam参数。这样在SetInstanceNull方法里面就可以操作刚才实例化的Children实例。所以
Children实例中的inter成员能够被更改。childrenParam =
null中语句只影响到childrenParam而没有影响到children给了我们一点提示,那就是将引用类型参数赋值为null其实是切断参数与
实例之间的联系,当没有任何参数与该实例有联系的时候,该实例就会被垃圾回收器给回收。

C# Null 赋值的更多相关文章

  1. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...

  2. thinkPHP5.x 更新字段为 NULL

    简介 tp5.x 提供了丰富的数据模型和数据库操作的方法,只要涉及 think\Model think\Query等,其中有一个软删除的 feature,可以指定字段$deleteTime来标记 re ...

  3. 不能将 Null 值赋给类型为 (不可为 null 的值类型)的成员。解决方法

    一般代码没有错,是对应的数据库里有的字段是NULL,不是主键,主键肯定不会是NULL的.是其他字段. 把这些列的NULL赋值.

  4. 转!!Java中关于Null的9个解释(Java Null详解)

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我认 ...

  5. null 之AddAll、Add和Boolean

    @Test //failed public void TestListAddAll(){ List<TravelerInfo> travelerInfoSummary=new ArrayL ...

  6. void指针、NULL指针和未初始化指针

    一个指针可以被声明为void类型,比如void *x.一个指针可以被赋值为NULL.一个指针变量声明之后但没有被赋值,叫做未初始化指针. 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  7. 何时使用SET和SELECT为变量赋值

    原文:何时使用SET和SELECT为变量赋值 我们经常使用SET和SELECT来为变量复制,但是有时候,只能选其一来使用,下面来看看这些例子,本例中使用AdventureWorks数据库来做演示. 通 ...

  8. Guvav:Options使用和避免NULL

    JAVA中的null null是Java中一个很重要的概念.null设计初衷是为了表示一些不确定的东西.null是Java中的关键字,它是大小写敏感的,你不能将null写成Null或NULL,编译器将 ...

  9. 关于Java中的Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

随机推荐

  1. C# winform DataGridView 常见属性

    C# winform DataGridView 属性说明① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤ 行的用户删除操作的自定义 ⑥ 行.列的隐藏和删 ...

  2. 【Spring】spring的7个模块

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  3. VS2017 IDE开发工具选型、安装和使用

    原文地址:https://blog.csdn.net/boonya/article/details/78739500 距离上次使用VS工具已是2年前了,这次准备选择比较新的版本来开发桌面程序了.总的来 ...

  4. 如何利用 Visual Studio 自定义项目或工程模板(转载)

    在开发项目的时候,由其是商业性质的大型项目时,往往需要在每个代码文件上都加上一段关于版权.开发人员的信息,并且名称空间上都需要带有公司的标志.这个时候,是选择在开发的时候手动添加还是自动生成呢? 我们 ...

  5. 【转】我为什么离开 Cornell

    我为什么离开 Cornell 很多人都知道,我曾经在 Cornell 博士就读,两年之后转学到了 Indiana 大学.几乎所有人,包括 Indiana 大学的人都感觉奇怪,为什么会有人从 Corne ...

  6. Java Nashorn--Part 3

    jjs 的 -Scripting 选项 jjs shell 是一个不错的方法来测试一些基本的 JavaScript,或者于不太熟悉的 JavaScript包进行交互(主要是指 javax.script ...

  7. [转]What are mode and status columns under gp_segment_configuration table

    February 16, 2017 10:39 Goal In this article we will try to understand and answer to the below two q ...

  8. Java 8 – TemporalAdjusters examples

    1. TemporalAdjusters Example to move a date to firstDayOfMonth, firstDayOfNextMonth, next Monday and ...

  9. Zookeeper服务器配置项详解

    文章转自: http://www.bug315.com/article/159.htm http://www.bug315.com/article/160.htm Zookeeper是通过一个***. ...

  10. struts2:在Action中使用Servlet的API,设置、读取各种内置对象的属性

    有两种方式可以实现在Action中使用Servlet的API.一种是使用org.apache.struts2.ServletActionContext类,另一种是使用com.opensymphony. ...