给大家一道题,娱乐下。顺便散分C# codepublic class testClass{public virtual string name{get { return
给大家一道题,娱乐下。顺便散分
C# codepublic class testClass{ public virtual string name { get { return "111"; } } public virtual void Method() { string s = this.name; //s是多少 }}public class testClass1 : testClass{ public override string name { get { return "222"; } } public void aaa() { this.Method(); } public override void Method() { base.Method(); }}testClass1 c1 = new testClass1(); c1.aaa(); [解决办法] 222,没测试,猜测的,不过我的直觉应该不会错。
[解决办法] 你也很聪明的认为1L是这么认为的,呵呵
[解决办法] 不是啦,因为你使用的时候定义的是testClass1,如果这样写:
testClass c1 = new testClass1();
c1.aaa();
那样才有可能会理解为111
[解决办法] 友情路过。
[解决办法] 不懂 帮顶
[解决办法] 当然,我说的是有可能,而实际上却不是哦。因为显示接口实现的时候就是这样的,不然就不需要区分出2种接口实现方式了。
[解决办法] 基础有点欠缺了,回去复习下
[解决办法] 请自行搜索“接口的显示实现和隐示实现”
显示实现就是将类型强制转换到接口类型才能调用的实现,虽然定义的是继承类,但是使用的时候要作为其接口才能访问其方法,通常情况下是不可见的。
而你这里都定义的是public,因此怎么都是透明的了,直接被改写为了222返回。
[解决办法] 很简单的问题。
其实如果把get/set看作方法。似乎这个问题就容易理解很多。实际上get/set也的确就是方法。
[解决办法] 应该是111吧,目测80%以上
[解决办法] 都override了,get出来的很明显了。。
[解决办法] 探讨 都override了,get出来的很明显了。。[解决办法] 探讨 为什么不是111呢 其实不是override的事 引用: 都override了,get出来的很明显了。。[解决办法] 探讨 不是啦,因为你使用的时候定义的是testClass1,如果这样写: testClass c1 = new testClass1(); c1.aaa(); 那样才有可能会理解为111[解决办法] GetType显然是当前实例的类型。
否则所有对象GetType都会返回Object类型了。
[解决办法] 探讨 其实这个真不管override的事,有关系,但是不是很大 引用: 引用: 都override了,get出来的很明显了。。 我也是觉得这样的[解决办法] get也就是个get方法 .net执行方法调用的时候会去元数据里面查这个方法的IL代码然后编译 这边重写了get方法所以方法指针指向的是子类的get方法
探讨 其实这个真不管override的事,有关系,但是不是很大 引用: 引用: 都override了,get出来的很明显了。。 我也是觉得这样的[解决办法] 因为new对象的时候一个对象的内存模型包含3个东西 一块儿指向该对象type类的指针(gettype方法用) 一块儿同步索引(lock语句用)还有一块儿是自身代码 你在new testClass1的时候指向type类的指针实际指向的就是一个testClass1的type类 这个过程是在你调用构造函数的时候就确定了的 所以说虽然实例化的时候你所用的是一个testClass类型的引用:
GetType显然是当前实例的类型。 否则所有对象GetType都会返回Object类型了。[解决办法] this指代的永远都是实例本身 即使你的引用是testClass类型 但是实例本身任然是testClass1是毋庸置疑的[解决办法] 这个必须是222,呵呵,顶楼主!!![解决办法] 呵呵,订楼主一下[解决办法] 学习了,高手就是多呀[解决办法] 我类个去,怎么看不到我自己发的话呀?[解决办法] 不喜欢做这种题!据我察言观色得出是222.[解决办法] 不是222, 就是111 if(s != "222") { s = "111"; }[解决办法] public override string name { get { return "222"; } } 得到父类的name是"222", public void aaa() { this.Method(); } public override void Method() { base.Method(); } 得到aaa()调用的是父类的Method()。 this.name被重写了,故为"222". 不知道对不对~!!~!~[解决办法]
探讨 题不是关键 this是关键 引用: 不喜欢做这种题!据我察言观色得出是222.[解决办法] 测试结果为"222"
[解决办法] 再来一个别人做不出来的~
[解决办法] 对this的理解一直都是指向this这四个英文字母所在的类文件的Class……
[解决办法] 探讨 我的意思是为什么是testClass1而不是testClass, 引用: GetType显然是当前实例的类型。 否则所有对象GetType都会返回Object类型了。[解决办法] 此楼甚好。
[解决办法] 楼主坚持这是this而不是override的作用,敢不敢把override改成new试试看
[解决办法] 怎么获得
[解决办法] 探讨 楼主坚持这是this而不是override的作用,敢不敢把override改成new试试看[解决办法] C# codepublic class testClass{ public virtual string name { get { return "111"; } } public virtual void Method() { Type s = this.GetType(); //大家平时肯定认为这个this的类型是testClass吧。其实呢 }}public class testClass1 : testClass{ }testClass1 c1 = new testClass1(); // 其实呢?其实是你自己坚持要忽略这句话,才这么纠结 c1.Method();[解决办法] 果然大神哪[解决办法] 有点明白楼主要说的,一般我们在类里用this都是指本类的,但是Type s = this.GetType(); 的this是testClass1 ,应该是63楼说的原因[解决办法] 我就说了你非要忽略你自己写的程序。总是在纠结基类。 你做开发只看基类的啊?不看子类,不看声明?那我只能说感到遗憾。 你一直认为this在testClass里面,所以它的类型是testClass 对,没错,你说得对极了。 但是你这么说,那下面这句话就等于是P话。 testClass1 c1 = new testClass1(); ------ 我觉的你根本就是在玩弄大家。 你的行为就像这个贱人一样: A:今天我要做糖水,但是我决定不放糖,我放盐。你觉得做出来是什么味道? B:咸的。 A:但是「糖」水不应该是甜的吗? B:你放的是盐啊,当然是咸的。 A:但是我做的是糖水啊,它就应该是甜的啊。 B:咸的。 A:糖水是甜的。你先说这句话正确么?你敢说这句话错误么? B:!@#¥%……&*[解决办法]
探讨 有点明白楼主要说的,一般我们在类里用this都是指本类的,但是Type s = this.GetType(); 的this是testClass1 ,应该是63楼说的原因[解决办法] 探讨 引用: 有点明白楼主要说的,一般我们在类里用this都是指本类的,但是Type s = this.GetType(); 的this是testClass1 ,应该是63楼说的原因 。。this指的是当前示例,而不是当前类,把这个搞清楚。[解决办法] 探讨 呵呵 我发点东西让大家讨论下 就开始喷了? CSDN有这么多没素质的人吗?testClass1 c1 = new testClass1();是实例化了一个testClass对象,但是我还是想说你没弄明白,这题主要是说明对象指针传递,而不是说是实例化的哪个类。你应该去印证对象指针传递而不是其他问题 引用: 我就说了你非要忽略你自己写的程序。总是在纠结基类。……[解决办法] 我一进这个帖子内存飙到98%,求高手解释。。[解决办法] 探讨 我一进这个帖子内存飙到98%,求高手解释。。[解决办法] 探讨 我一进这个帖子内存飙到98%,求高手解释。。[解决办法] 探讨 this是实例化的一个对象,这没错,你理解的也没错,this是指向调用者,也许是你妹明白我想缠诉的意思, 比如说给出一个类,里面一个虚方法,虚方法里面使用了this指针,在大部分开发人员看来,这个this肯定是testClass类型的,我当初也是这样认为,但是我看了一些资料之后,就明白了,其实this并不一定是本类对象,而是调用者的指针,我没有觉得这个问题跟ovirriode没关系,因为c……[解决办法] this指向的就是当前实例 new什么this指向的就是什么~没什么可说的[解决办法] 探讨 public virtual void Method() { string s = this.name; Console.WriteLine(name); Console.ReadKey(); } 单看这个方法,this是指向什么呢,应该深究的是这个方法里的this的类型,而不是new的什么类型 引用: this指向的就是当前实例 ……[解决办法] 比如你new testClass1那么this就是testClass1,new testClass,this就是testClass探讨 public virtual void Method() { string s = this.name; Console.WriteLine(name); Console.ReadKey(); } 单看这个方法,this是指向什么呢,应该深究的是这个方法里的this的类型,而不是new的什么类型 引用: this指向的就是当前实例 ……[解决办法] testClass你根本就没有创建他的对象,只是在子类里面重写了父类的方法,代码是不可能无中生有的。 你的这个程序从头到尾就一个实力那就是testClass1 你的方法本身就不会在编译的时候初始化,他会被放在内存的代码区存放着。 何来的testClass? 这个是单纯的抛开你的理论来讲的。 就算你new了一个testClass,对象的地址又不是一个,肯定也8杆子打不着了 你new testClass1他的this就是testClass1,没有什么可辩解的,虽然代码是在testClass代码区中执行的,不代表是在testClass对象中执行的。[解决办法] 探讨 我明白 我问题的重点是方法内的this为什么是指向testClass1,这是指针传递,当然你说的new testClass1是指针传递前提,我相信大部分的C#程序员肯定都会回答this是testClass的对象。。。 引用: 比如你new testClass1那么this就是testClass1,new testClass,this就是testClass 引用 8……[解决办法] 探讨 喝多了,说话得罪莫怪。。 我想请问你这句结论是怎么得出来的? 「我相信大部分的C#程序员肯定都会回答this是testClass的对象」
[解决办法] 天天喝。。 看会电视。。 你们慢慢研究。。[解决办法] 加班中.....[解决办法] 探讨 概念不一样,有空多多研究asp.net的架构。。。。[解决办法] 探讨 typeof和GetType是一样的结果得嘛