博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Null 赋值
阅读量:6040 次
发布时间:2019-06-20

本文共 1201 字,大约阅读时间需要 4 分钟。

在此之前,我们先看一段程序:

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其实是切断参数与 实例之间的联系,当没有任何参数与该实例有联系的时候,该实例就会被垃圾回收器给回收。

转载地址:http://sdrhx.baihongyu.com/

你可能感兴趣的文章
数据存储小例
查看>>
Spring Boot 配置优先级顺序
查看>>
php 信号量
查看>>
C++中构造函数详解
查看>>
数据库课程实习设计——酒店房间预订管理系统
查看>>
vue.js的模板渲染
查看>>
关于H5+css3的一些简单知识
查看>>
Google-Authenticator
查看>>
C语言--第0次作业
查看>>
离线数据分析流程及推荐系统架构图
查看>>
第一个web项目
查看>>
程序员职业生涯探讨(转)
查看>>
移动应用跨平台之旅
查看>>
poj 1426 Find The Multiple(bfs)
查看>>
zabbix部署
查看>>
Redis持久化及复制
查看>>
Selenium基础知识(详解IDE命令、css及xpath定位一)
查看>>
Java Web整合开发(82)
查看>>
Scrum 简介
查看>>
Windows批处理 调用程序后 不等待子进程 父进程继续执行命令
查看>>