首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

给大家一道题,娱乐上。顺便散分

2012-11-08 
给大家一道题,娱乐下。顺便散分C# codepublic class testClass{public virtual string name{get { return

给大家一道题,娱乐下。顺便散分

C# code
public 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# code
public 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是一样的结果得嘛

热点排行