大家一起探讨两道C 大家一起探讨团队管理方面的话题
创始人
2024-04-27 10:20:24
0次

先看C#面试题大家可以先想想结果

C#面试题1. string aString = "a" + "b" + "c"; 有几次内存分配;

C#面试题2. 多态的考察,如下的输出结果。

  1. Code  
  2. public class Program  
  3.     {  
  4.         static void Main(string[] args)  
  5.         {  
  6.             A a = new C();  
  7.             a.Show();  
  8.             Console.ReadKey();  
  9.         }  
  10.     }  
  11.     public class A  
  12.     {  
  13.         public virtual void Show()  
  14.         {  
  15.             Console.WriteLine("A");  
  16.         }  
  17.     }  
  18.     public class B:A  
  19.     {  
  20.         public new virtual void Show()  
  21.         {  
  22.             Console.WriteLine("B");  
  23.         }  
  24.     }  
  25.     public class C:B  
  26.     {  
  27.         public override void Show()  
  28.         {  
  29.             Console.WriteLine("C");  
  30.         }  
  31.     } 

我自己的答案如下

答案

我的答案是:

1次,或者没有

A。

引入和一点分析

1 第一个问题是值类型和引用类型说起的。面试的人问我关于值类型和引用类型。我blabla说了些堆栈和内存分配。我说了string是特殊的引用类型,他不可变。然后引出这个问题。string aString = "a" + "b" + "c"; 有几次内存分配。按着开始的引导。我的答案是a一次,b一次,ab一次。因为ab还是string不可变。那么abc还需要一次。具体不数是几次。面试官给我的答案也是很多次。他也是这么认为的。

回来之后我写了这个代码。看了下IL发现不是这么回事。CLR可以直接生成字符串"abc".

  1. CLR可以直接生成字符串

后来请教高人,多少明白是怎么个意思了。因为+的含义编译器是知道的就是编译器知道string不可变,所以提前在生成的IL代码里面写死了,写在数据段里面了,等同于写死了。如果编译器比较先进的话他能检测到aString也不需要内存。

  1. 2 看IL

  

看IL

IL中也是非常的清楚的现实了调用的是A中的Show方法。我的理解是:

A定义了方法show,注意B中的show方法虽然也是virtual的,但是之前有一个new。B从新定义了一个方法show。

C 中的override的是B定义的那个方法。

【这个时候实际上C里面有两个show方法。】这段有待於斟酌。

出现这种情况的时候 如果通过基类调用的话 就选距离那个基类最近的方法。所以会调用A中的Show方法。

看了回复觉得徐少侠解释的非常好!!

#23楼2009-08-10 14:46 | 徐少侠      

用距离基类近来解释似乎不科学

A类有虚Show

B类就已经有两个Show方法了

C也的确有两个

由于最终的变量是A类型的,因此搜索函数入口时从基类A的入口表开始,根据虚方法定义查找子类的重写方法,但是由于无法再B类定义中发现override方法
则最终调用的是A的现实

Ivony...解释同样精彩。

回复  引用  查看  删除   #27楼2009-08-10 14:56 | Ivony...      

在C的内部,你就能调用到这三个方法:

  1. public class C : B  
  2. {  
  3. //...  
  4.  
  5. public void Test()  
  6. {  
  7. ((A) this).Show();  
  8. base.Show();  
  9. this.Show();  
  10. }  
  11.  
  12. }  
  13. =======================================  
  14.  
  15.  
  16. Code2  
  17.     public class Program  
  18.     {  
  19.         static void Main(string[] args)  
  20.         {  
  21.             A a = new C();  
  22.             a.Show();  
  23.             Console.ReadKey();  
  24.         }  
  25.     }  
  26.     public class A  
  27.     {  
  28.         public virtual void Show()  
  29.         {  
  30.             Console.WriteLine("A");  
  31.         }  
  32.     }  
  33.     public class B:A  
  34.     {  
  35.         public override void Show()  
  36.         {  
  37.             Console.WriteLine("B");  
  38.         }  
  39.     }  
  40.     public class C:B  
  41.     {  
  42.         public new void Show()  
  43.         {  
  44.             Console.WriteLine("C");  
  45.         }  
  46.     } 

【编辑推荐】

  1. 简单介绍C#预处理
  2. 学习C#无词尾符号经验谈
  3. C#调用QuickTest自动化
  4. 详解C#正规表达式
  5. C#字符串插入html标签

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...