在此之前,我们先看一段程序:
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. 【Spring】Spring+SpringMVC+MyBatis框架的搭建

    1,SSM的简介 SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中s ...

  2. maven最全教程

    Maven 教程 1.Maven概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一套完整的构建生命周期框架.开发团队几乎不用花多少时间就能够自动完成工程的基 ...

  3. Java – Generate random integers in a rangejava获取某个范围内的一个随机数

    In this article, we will show you three ways to generate random integers in a range. java.util.Rando ...

  4. 创建多模块springcloud应用eureka server和client和消费端demo

    使用环境是 STS + maven 1 创建父级 项目,springcloud-demo1 new -> maven project -> 按照要求进行配置即可.然后删除 src目录,因为 ...

  5. css冻结列的效果

    <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...

  6. PCIE 调试过程记录

    遇到的问题 PCIE link不稳定 配置空间读写正常,Memory mapping空间读写异常 缘由 之前对PCIE的认识一直停留在概念的阶段,只知道是一个高速通讯协议,主要用于板内.板间的高速BU ...

  7. Vue2.0 v-for 中 :key 的作用

  8. Hibernate 建立一对多双向关联关系

    下面内容整理自<精通Hibernate>第二版 注:既然是双向关联."一对多双向关联"和"多对一双向关联"是同一回事. 对象位于内存中,在内存中从一 ...

  9. nfs 客户端启动报错rpc.mountd: svc_tli_create: could not open connection for tcp6

    # /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS mountd: rpc.mountd: svc_tli_creat ...

  10. socket.io笔记二之事件监听回调函数接收一个客户端的回调函数

    //服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...