博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我们应该怎么去理解.net类型传递 .
阅读量:5085 次
发布时间:2019-06-13

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

我们应该怎么去理解.net类型传递

如果按值传递引用类型,被调用者可能改变对象的状态数据的值,但不能改变所引用的对象。

如何理解以上两句话,首先我们先看一段代码:

先定义一个 Person 类,如下:

        class Person
        {
            public string personName { get; set; }
            public int personAge { get; set; }

            public Person(string name, int age)

            {
                personName = name;
                personAge = age;
            }
            public Person()
            {

            }

            public void Display()
            {
                Console.WriteLine("Name: {0},Age: {1}", personName, personAge);
            }
        }接着用添加一个方法:

        static void SendAPersonByValue(Person p)
        {
            p.personAge = 99;
            p.personName = "Nikki";

            p = new Person("Tom",100);  //注意这句代码

        }在 Main() 方法中写入代码:

        static void Main(string[] args)
        {
            Person fred = new Person("Fred",12);
            fred.Display();

            SendAPersonByValue(fred);

            fred.Display();
        }注意 p = new Person("Tom",100); 这行代码,SendAPersonByValue()按值传递 p,猜想一下输出结果。

输出:Name: Fred,Age: 12

         Name: Nikki,Age: 99

由输出结果可以看出 SendAPersonByValue() 方法更改了对象的字段,Perosn p 不是按值传递吗,按值传递不是拷贝的副本吗,怎么会对对象进行更改呢?

而且 p = new Person("Tom",100); 这句代码似乎没起到任何作用。

回到文章顶部,如果按值传递引用类型,被调用者可能改变对象的状态数据的值,但不能改变所引用的对象。

书上是这样定义的,但是该怎么理解上面这句话呢?其实按值传递真正意义上是指传递栈上存储的值,当栈上存储的是值类型的变量时,传递的就是一个值的副本,因此对副本的更改不会导致原值的改变;当栈上存储的是一个地址(引用类型的变量)时,传递的就是这个地址的拷贝,它们指向托管堆上的同一个对象,当对托管堆上的对象更改时,自然会导致原对象的改变;而对变量本身进行更改时,更改的就是这个地址本身,因此不会导致原对象的改变。

用图来表示最适合不过了:

按值传递引用类型:

 

由图可知,对 p 本身更改并不影响 fred ,对p字段更改则会引起中字段的改变,因为它们指向同一个对象。

 

添加按引用传递的方法:

        static void SendAPersonByReference(ref Person p)
        {
            p.personAge = 99;

            p = new Person("Tom",100);  //注意这句代码

        }修改 Main() 方法:

        static void Main(string[] args)
        {
            Person fred = new Person("Fred",12);
            fred.Display();

            SendAPersonByReference(ref fred);

            fred.Display();
        }输出:Name: Fred,Age: 12
         Name: Tom,Age: 100
按引用传递引用类型:如果按引用传递引用类型,被调用者可能改变对象的状态数据的值和所引用的对象。

按引用传递引用类型:

 

 按引用传递则是对栈中变量自身的地址进行拷贝(不是变量中存储的地址),因此不管是对其变量本身还是其指向的对象作更改都会导致原数据的改变。

 

 以上纯属理解,不对的地方还请纠正,以便更改。

 

转载于:https://www.cnblogs.com/xuedaonent/archive/2012/08/23/2653364.html

你可能感兴趣的文章
实验五 Java网络编程及安全
查看>>
32位与64位 兼容编程
查看>>
iframe父子页面通信
查看>>
ambari 大数据安装利器
查看>>
java 上传图片压缩图片
查看>>
magento 自定义订单前缀或订单起始编号
查看>>
ACM_拼接数字
查看>>
计算机基础作业1
查看>>
Ubuntu 深度炼丹环境配置
查看>>
C#中集合ArrayList与Hashtable的使用
查看>>
从一个标准 url 里取出文件的扩展名
查看>>
map基本用法
查看>>
poj-1163 动态规划
查看>>
Golang之interface(多态,类型断言)
查看>>
Redis快速入门
查看>>
BootStrap---2.表格和按钮
查看>>
Linear Algebra lecture 2 note
查看>>
CRC计算模型
查看>>
Ajax之404,200等查询
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>