码迷,mamicode.com
首页 > 其他好文 > 详细

怀疑:如果方法的返回值类型是引用类型的话,那么返回的就是地址。

时间:2015-08-13 13:42:25      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

由:

“A property method may require additional memory or return a reference to something
that is not actually part of the object’s state, so modifying the returned object has no
effect on the original object; querying a field always returns a reference to an object
that is guaranteed to be part of the original object’s state . Working with a property
that returns a copy can be very confusing to developers, and this characteristic is frequently not documented .“

这段话源自《CLR via C#》第4版中第十章 属性 。

这段话主要意思是:一个属性方法(指的是自动属性的get方法)可能要求额外的内存,另外返回的引用实际上不是对象的状态的一部分(意思是返回的不是对象的成员字段的引用),所以修改返回值不会影响原来的对象;查询字段通常返回引用,该引用可以保证是原来的对象的状态的一部分。属性返回的是copy,这会让开发者感到困惑,而且这种情况通常没有被记载在文档中。

我为了验证这段话中”查询字段通常返回引用,该引用可以保证是原来的对象的状态的一部分“,写了个Demo。

声明一个类型Student,

成员:

3个字段:Int32类型的no、String类型的str、Object类型的obj;

3个查询字段的方法: 返回Int32的方法GetNo()、返回String类型的方法GetStr()、返回Object类型的方法GetObj(

class Student
    {
        internal Int32 no;
        internal String str;
        internal Object obj;
        internal Int32 GetNo() { return this.no; }
        internal String GetStr() { return this.str; }
        internal Object GetObj() { return this.obj; }
    }

在控制台的Main()方法中

static void Main(string[] args)
        {
            var s1 = new Student();
            var no = s1.GetNo();//no的地址应该等于s1的成员no的地址
            var str = s1.GetStr();//str的地址应该等于s1的成员Str的地址
            var obj = s1.GetObj();//obj的地址应该等于s1的成员obj的地址
            Console.WriteLine(ReferenceEquals(no, s1.no));//使用静态ReferenceEquals()方法判断两个变量是否相等,下同。
            Console.WriteLine(ReferenceEquals(str, s1.str));
            Console.WriteLine(ReferenceEquals(obj, s1.obj));
            Console.Read();
        }

在即时窗口中,我观察&s1、&s1.no、&s1.str、&s1.obj、Main()方法中的&no、&str、&obj。如下图所示:

技术分享

分析其结果:

一、在即时窗口中:观察到s1.no和no的地址不相等,s1.str和str的地址不相等,s1.obj和obj的地址不相等。

二、通过静态方法ReferenceEquals()判断的结果是值类型的no不相等,其他的都相等。

那么问题来了:

      即时窗口中观察的地址是否有误?如果有误,那是不是vs2015的BUG?如果无误,那静态方法ReferenceEquals()为什么会判断str和obj是同一个地址呢?

怀疑:如果方法的返回值类型是引用类型的话,那么返回的就是地址。

标签:

原文地址:http://www.cnblogs.com/kexxxfeng/p/4726760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!