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

缘由:

“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是同一个地址呢?

时间: 2024-09-29 20:27:51

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

C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分别来看看它们的使用. 一.void无返回值 void关键字我们都不陌生,它申明方法没有返回值.它的使用也很简单,我们来看一个示例就能明白. public class ORDER { publi

[转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义IHttpActionResult接口的实现 三.HttpResponseMessage 四.自定义类型 五.总结 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学

WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult     (需要MVC高版本才会支持,VS2012/2013不支持,请升级DLL文件或者到VS2015开发环境) HttpResponseMessage 自定义类型 此篇就

抽象类和接口作为返回值类型的问题

1 /* 2 返回值类型 3 引用类型: 4 类:返回的是该类的对象 5 抽象类:返回的是该抽象类的子类对象 6 接口: 7 */ 8 abstract class Person { 9 public abstract void study(); 10 } 11 12 class PersonDemo { 13 public Person getPerson() { 14 //Person p = new Student(); 15 //return p; 16 17 return new St

Web Api 接口返回值不困惑:返回值类型详解

前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 WebApi 接口参数:传参详解,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值.还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看. 使用过Webapi

java方法重写返回值类型

重写(Overriding)(1) 父类与子类之间的多态性,对父类的函数进行重新定义.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写.方法重写又称方法覆盖.(2)若子类中的方法与父类中的某一方法具有相同的方法名.返回类型和参数表,则新方法将覆盖原有的方法.如需父类中原有的方法,可使用super关键字

Java常见面试题02-方法重写和方法重载的区别?方法重载能改变返回值类型吗?

方法重写和方法重载的区别?方法重载能改变返回值类型吗?       A:Override方法重写和Overload方法重载的区别? Overload是否可以改变返回值类型?可以 方法重写 •  子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写. •  使用特点: •   如果方法名不同,就调用对应的方法 •   如果方法名相同,最终使用的是子类自己的 父类方法重写格式:super.父类成员方法名 •  方法重写的注意事项   父类中私有方法不能被重写   子类重写父类方法时,访

Spring MVC方法的返回值类型

一,String类型作为返回值类型 返回值类型为String时,一般用于返回视图名称 1.当方法返回值为Null时,默认将请求路径当做视图 /jsp/thread/secondRequest.jsp 如果说没有试图解析器,如果返回值为Null携带数据只能用JSON 2.当方法返回一个String的字符串时,当字符串为逻辑视图名时只返回视图,如果要携带数据则使用request,session或者Json 如果要用Model或者ModelMap传递数据,那么Model或者ModelMap绝对是方法入

SpringMVC方法的返回值类型和自动装配

1. void类型作为返回值类型 /** * 如果方法写成了void就跟原来servlet含义是差不多 的 * json */ @RequestMapping("/firstRequest") public void firstRequest(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException { UserInfo info=new UserI