随笔-312  评论-12034  文章-2  trackbacks-256
English Version: http://dflying.dflying.net/1/archive/104_c_basic_interview_questions.html

如果你的简历上面写“熟悉/了解C#”,那么你就应该能够回答下面的这些基础问题。我将给出自己的简要答案以供参考。欢迎讨论。
如果是“精通”,那么请参考:http://www.cnblogs.com/dflying/archive/2006/04/01/364458.html

  1. 传入某个属性的set方法的隐含参数的名称是什么?
    value
    ,它的类型和属性所声名的类型相同。
  2. 如何在C#中实现继承?
    在类名后加上一个冒号,再加上基类的名称。
  3. C#支持多重继承么?
    不支持。可以用接口来实现。
  4. protected修饰的属性/方法在何处可以访问?
    在继承或间接继承与这个类的子类中可以访问。
  5. 私有成员会被继承么?
    会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
  6. 请描述一下修饰符protected internal
    protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。
  7. C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?
    两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。
  8. C#中所有对象共同的基类是什么?
    System.Object.
  9. 重载和覆写有什么区别?
    重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。
  10. 在方法定义中,virtual有什么含意?
    virtual修饰的方法可以被子类覆写。
  11. 能够将非静态的方法覆写成静态方法么?
    不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override
  12. 可以覆写私有的虚方法么?
    不可以,甚至子类中无法访问父类中的私有方法。
  13. 能够阻止某一个类被其他类继承么?
    可以,使用关键字sealed
  14. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
    可以,标记这个类为public,并标记这个方法为sealed
  15. 什么是抽象类(abstract class)?
    一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。
  16. 何时必须声明一个类为抽象类?
    当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
  17. 接口(interface)是什么?
    只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。
  18. 为什么不能指定接口中方法的修饰符?
    接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。
  19. 可以继承多个接口么?
    当然。
  20. 那么如果这些接口中有重复的方法名称呢?
    这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。
  21. 接口和抽象类的区别是什么?
    接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。
  22. 如何区别重载方法?
    不同的参数类型,不同的参数个数,不同的参数顺序。
  23. constreadonly有什么区别?
    const
    关键字用来声明编译时常量,readonly用来声明运行时常量。
  24. System.String System.StringBuilder有什么区别?
    System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。
posted on 2006-04-01 20:36 Dflying Chen 阅读(21015) 评论(56)  编辑 收藏 网摘 所属分类: .NET 综合C#

评论:
#1楼 2006-04-02 14:35 | Phoenix Huang[未注册用户]
90%是面向对象设计的问题。
  回复  引用    
#2楼[楼主] 2006-04-02 14:48 | Dflying Chen      
@Phoenix Huang
是的,当然这些也考察了C#的语言基础。

  回复  引用  查看    
#3楼 2006-04-02 17:15 | 林子      
不错!
不过如果答案如果能再OO一些那就现好了!

  回复  引用  查看    
#4楼[楼主] 2006-04-02 18:29 | Dflying Chen      
@林子
欢迎您提出修改的建议 :)

  回复  引用  查看    
#5楼 2006-04-02 22:41 | 装配脑袋      
有几道题的答案错误,列出来供你面试时参考:

3 C#支持多重继承么?
答案是类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。

6 请描述一下修饰符protected internal。
正确答案是,在同一个Assembly中,他的访问级别和public一样,而跨Assembly访问时,他的访问级别同protected一样。即protected的范围 + internal的范围。

11 能够将非静态的方法覆写成静态方法么?
答案并没有大错,只是静态方法根本无override概念,属于引起困惑的问题

13 能够阻止某一个类被其他类继承么?
答案没错,但是如果应试者提到将所有构造函数的访问级别都设为Private或子类无法访问到的其他级别(Assembly外的internal),也有同样的效果。

14 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
同样是可能引起困惑的题。因为默认(不带virtual)的方法就是不能被override的。带sealed的方法必定是被override过的。

20 接口和抽象类的区别是什么?
还有一个容易被忽视的区别,C#不允许接口带有静态成员,尽管这不是.NET的限制。

23 const和readonly有什么区别?
还有一些区别,当应试者提到时你不能说是错的:作字段时const隐含静态,const可以是局部的,readonly可以在构造函数中初始化等。

  回复  引用  查看    
#6楼[楼主] 2006-04-03 09:32 | Dflying Chen      
@装配脑袋
3 C#支持多重继承么?
--答案是类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。
inherit an interface没有什么不妥,为什么中文就不可以?

6 请描述一下修饰符protected internal。
--正确答案是,在同一个Assembly中,他的访问级别和public一样,而跨Assembly访问时,他的访问级别同protected一样。即protected的范围 + internal的范围。
同一个Assembly中依然是protected,您可以查阅一下相关资料。

11 能够将非静态的方法覆写成静态方法么?
--答案并没有大错,只是静态方法根本无override概念,属于引起困惑的问题
我只是问“能覆写成”么?如果她知道静态方法根本无override概念,显然可以打出这个问题。

13 能够阻止某一个类被其他类继承么?
--答案没错,但是如果应试者提到将所有构造函数的访问级别都设为Private或子类无法访问到的其他级别(Assembly外的internal),也有同样的效果。
您说的对,但如果这样思路想下来,我还可以说用C++写父类不能让C#继承。不要太钻牛角尖了。

14 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
--同样是可能引起困惑的题。因为默认(不带virtual)的方法就是不能被override的。带sealed的方法必定是被override过的。
这个答案有理。

20 接口和抽象类的区别是什么?
--还有一个容易被忽视的区别,C#不允许接口带有静态成员,尽管这不是.NET的限制。
有道理,但接口不可以有成员吧,不管静态还是非静态的

23 const和readonly有什么区别?
--还有一些区别,当应试者提到时你不能说是错的:作字段时const隐含静态,const可以是局部的,readonly可以在构造函数中初始化等。
我不是很明白你的意思。但我觉得回答出“const关键字用来声明编译时常量,readonly用来声明运行时常量。”已经足够完美了。

  回复  引用  查看    
#7楼 2006-04-03 09:44 | 装配脑袋      
第六题你错了,不要坚持错误好吗?去试一下就什么都知道了。只有C++/CLI才支持你描述的那种访问级别,internal AND protected.

第十三题,我并非钻牛角尖,我恰好用到了这种手法。我需要一个抽象基类作为我的泛型类型字典,为了模拟type-traits我要求我的继承体系内类的数量有限而且对外隐藏。所以我就需要一个具有internal构造函数的抽象类,只有我自己的代码可以继承他,外部的不可以。你也许不能理解为什么这样做,但是它工作得很好。

  回复  引用  查看    
#8楼 2006-04-03 09:50 | 装配脑袋      
第二十题,成员函数也叫成员。这很重要,因为operator overloading的过程是静态的。

第二十三题,const可以用于局部常量,而readonly,实际是类的initonly字段,显然不能是局部的。

  回复  引用  查看    
#9楼 2006-04-03 10:02 | 装配脑袋      
如果我是参加面试的人,你会对我有何感想?
我真的不是钻牛角尖,我每一个质疑,都是我以我的真实程序为依据的,你忽视的地方并不是我恰好关注的地方,而是我一开始就关注的。

  回复  引用  查看    
#10楼[楼主] 2006-04-03 10:20 | Dflying Chen      
@装配脑袋
第六题是我错了,感谢指正.
第十三题我明白你的意思,只是我感觉答出来sealed就够了。
第二十题,我不知道成员函数也叫成员,一直用方法(method)来表示。成员函数是member function么?

  回复  引用  查看    
#11楼[楼主] 2006-04-03 10:21 | Dflying Chen      
@装配脑袋
你忽视的地方并不是我恰好关注的地方,而是我一开始就关注的。
这句话什么意思?

  回复  引用  查看    
#12楼 2006-04-03 10:24 | 装配脑袋      
就是说,我并不是为了挑你的错而想这么深的,而是一开始就知道

PS. method的定义不就是member function吗。。。

  回复  引用  查看    
#13楼[楼主] 2006-04-03 10:27 | Dflying Chen      
@装配脑袋
感谢指点,受益匪浅:)
member function好久没有听说了,我基础也不是很好,见笑了。

  回复  引用  查看    
#14楼 2006-04-05 16:31 | 小新0574      
我都能答出来,哈哈,熟悉就是这种级别么?出些asp.net的题做做?
  回复  引用  查看    
#15楼 2006-04-14 13:34 | Inkerman[未注册用户]
quite useful, indeed.
Do you have English version of this blog?

I find it's very hard to read in Chinese as I learned my programming language only in English.

Thanks

Inkerman


  回复  引用    
#16楼[楼主] 2006-04-14 13:40 | Dflying Chen      
@Inkerman
sure, please refer to http://dflying.dflying.net/">http://dflying.dflying.net/
hope may help :-)

  回复  引用  查看    
#17楼 2006-05-05 14:58 | Li-Birch[未注册用户]
呵呵,不错不错~~
我是在校学生,快毕业了
因为不是计算机专业,但又很喜欢,一直都在自学,也做过项目
不过还是不系统,特别是些基础性的东西
希望能多点类似的资料~
谢谢谢谢~~

  回复  引用    
#18楼[楼主] 2006-05-05 18:18 | Dflying Chen      
@Li-Birch
谈这种东西要冒风险的:)

  回复  引用  查看    
#19楼 2006-05-07 09:33 | johnsir      
@Dflying Chen
为什么要冒风险呀 ?

  回复  引用  查看    
#20楼[楼主] 2006-05-07 09:53 | Dflying Chen      
@johnsir
这种问题往往带来很多争吵阿,还会被人骂……

  回复  引用  查看    
#21楼 2006-05-09 10:30 | totti[未注册用户]
能找到高手,但也存在碰到孔乙己的危险.
  回复  引用    
#22楼 2006-05-09 10:32 | totti[未注册用户]
这种OO面试题,一定要结合一个Demo进行机试,不然很有可能碰到孔乙己。
  回复  引用    
#23楼[楼主] 2006-05-09 10:33 | Dflying Chen      
@totti
呵呵,好多人“架构”都是一套一套的……吓人哦

  回复  引用  查看    
#24楼 2006-07-21 20:02 | 我支持 装配脑袋[未注册用户]
好的程序员,必须在每一个基础上有最清晰的理解.一知半解很可怕的。
  回复  引用    
#25楼 2006-07-28 10:07 | a_a      
后面有几道题答不上来,看来我基础还差得很远呀!

不过我也发现了一个问题,就是第24题,以我目前所学习的程度来看,应该是不对的。

24. System.String 和System.StringBuilder有什么区别?
System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。

我想StringBuilder中封装的应该也是一个普通的String,而不是“可变的字符串”,我特地用Reflector看了一下,结果也是这样。StringBuilder应该是封装了一系列方便对字符串进行操作的方法,并且对效率进行了优化。

不知道我说的对不对,请指正啦。

  回复  引用  查看    
#26楼 2006-08-02 18:19 | 一[未注册用户]
C#支持多重继承么?
答案是类之间不支持,接口之间支持。类对接口叫做实现,不叫继承。

这个说的好的,本质上是不支持多重继承的

  回复  引用    
#27楼 2006-08-03 21:46 | crazydd[未注册用户]
请问: abtract class 可以有构造函数嘛?还是必须有?
abtract class 和 接口的区别,我觉得是不是还有一个? abtract class可以有数据成员,而接口不可以。我是菜鸟,请指教。

  回复  引用    
#28楼 2006-09-08 11:28 | 月亮lover      
感谢楼主和装配脑袋,受益匪浅
  回复  引用  查看    
#29楼[楼主] 2006-09-08 11:55 | Dflying Chen      
@月亮lover
我也要感谢装配脑袋,好多地方都让我豁然开朗!

  回复  引用  查看    
#30楼 2006-10-20 00:31 | MK2      
@a_a
string 虽然是引用类型,但每次操作都是做值复制,要重新申请和分配内存,再将新的string 的引用传出`````

而StringBuilder 是预先申请了空间,默认大小是16,只要当前字符串实质大小不超过可用空间大小,就不需要申请内存和复制工作。若要对字符串做大量操作,一般推荐用StringBuilder,因为申请分配内存和复制工作是很耗资源的。

在C#中,string类最奇怪,又是类,但传递的又不是引用,只是做值复制,这个特性又是非引用类型的特点``````

  回复  引用  查看    
#31楼 2006-11-26 18:14 | yunhuasheng      
不错,收藏!
  回复  引用  查看    
#32楼[楼主] 2006-11-26 21:00 | Dflying Chen      
@MK2
“又是类,但传递的又不是引用,只是做值复制”
这是真的么??

  回复  引用  查看    
#33楼[楼主] 2006-11-26 21:00 | Dflying Chen      
@yunhuasheng
有帮助就好:)

  回复  引用  查看    
#34楼 2006-11-26 22:48 | Boler Guo      
好像确实是implement an interface 而不是 inherit an interface , inherit a class 倒是对的。
  回复  引用  查看    
#35楼 2007-01-10 11:09 | Benjamin[未注册用户]

确实是 implement an interface.

不是说lz,不过国内的很多技术经理本身技术实在是够戗。让这些人面试,真是一种耻辱啊。

  回复  引用    
#36楼 2007-01-10 16:58 | yunhuasheng      
感觉对面试者还是很有帮助的!!
  回复  引用  查看    
#37楼 2007-01-18 10:12 | 3er[未注册用户]
@Dflying Chen
百度到这个帖子的,说个题外话,只要符合.Net的CLS兼容性,完全可以做一个程序,让c#继承VC++.NET的基类,实现VB.NET的接口,访问J#的方法。

>但如果这样思路想下来,我还可以说用C++写父类不能让C#继承。不要太钻牛角尖了。

  回复  引用    
#38楼 2007-02-05 01:16 | net[未注册用户]
基础太重要了.
  回复  引用    
#39楼 2007-02-11 10:56 | 大跨度[未注册用户]
楼主给出的对protected internal有误,新手们查查。别的我还没有发现
  回复  引用    
#40楼 2007-02-11 11:00 | 大跨度[未注册用户]
20 接口和抽象类的区别是什么?
--还有一个容易被忽视的区别,C#不允许接口带有静态成员,尽管这不是.NET的限制。
有道理,但接口不可以有成员吧,不管静态还是非静态的

-------------------------------------
接口中不可能出现静态成员!在编译阶段都过不去!

  回复  引用    
#41楼 2007-04-15 15:04 | mmn[未注册用户]
[url=http://***/37.htm]女子同丈夫和情夫[/url]
[url=http://***/38.htm]内地富太太俱乐部[/url]
[url=http://***/39.htm]想拥入怀的女性[/url]
[url=http://***/40.htm]日本的卫生间[/url]
[url=http://***/41.htm]女生周末夜生活纪实[/url]
[url=http://***/42.htm]巩俐 怀孕[/url]
[url=http://***/43.htm]海南人体艺术摄影第一人[/url]
[url=http://***/44.htm]走秀透明内衣[/url]
[url=http://***/45.htm]明星缤纷夜生活[/url]
[url=http://***/46.htm]内衣表情[/url]
[url=http://***/47.htm]中国空姐[/url]
[url=http://***/48.htm]私房写真[/url]
[url=http://***/49.htm]女明星清凉[/url]
[url=http://***/50.htm]珍贵雪獒[/url]
[url=http://***/51.htm]北京富豪俱乐部[/url]
[url=http://***/52.htm]妙龄小姐[/url]
[url=http://***/53.htm]爆强的中学生[/url]
[url=http://***/54.htm]偷看美女[/url]

  回复  引用    
#42楼 2007-05-29 11:03 | Anders06      
我也来专个牛角尖

>>>被protected修饰的属性/方法在何处可以访问?
在继承或间接继承与这个类的子类中可以访问。

内联类里也可以访问,它甚至可以其被内联类的私有成员.
class aclass
{
class bclass
{
}
}
bclass 是叫内联类吗,,概念忘记了

  回复  引用  查看    
#43楼[楼主] 2007-05-29 13:02 | Dflying Chen      
@Anders06
呵呵,这些问题的Bug多着呢,不过bclass是不是该叫内部类阿?

  回复  引用  查看    
#44楼 2007-08-10 14:29 | zzticzh[未注册用户]
受益良多 非常感谢
  回复  引用    
#45楼 2007-11-20 21:38 | lzkathy[未注册用户]
受益非浅

  回复  引用    
#46楼 2007-12-07 23:35 | 花样年华      
受益啊,以后多看书知道基础是很重要的!
  回复  引用  查看    
#47楼 2008-01-15 19:45 | jackeroo[未注册用户]
switch语句是if语句的变化?
  回复  引用    
#48楼 2008-01-29 12:00 | 破曉之陽      
真棒。。看那样子 我也该去看看基础的了。
  回复  引用  查看    
#49楼 2008-03-21 10:29 | 犯得上发撒[未注册用户]
不错
  回复  引用    
#50楼 2008-03-27 13:13 | IO[未注册用户]
都是些很基础的题目,专考语法的。很多人都能答得上来,但是来些代码做做就不一样了。
  回复  引用    
#51楼 2008-07-15 18:56 | Seattle      
17 接口(interface)是什么?
只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。
这个正确?

  回复  引用  查看    
#52楼 2008-09-28 18:49 | chen__chen[未注册用户]
# 私有成员会被继承么?
会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。


如何证明 ?????

请教了。

  回复  引用    
#53楼 2008-10-15 22:02 | 搁浅の鱼[未注册用户]
protected internal
访问仅限于从包含类派生的当前程序集或类型。
(c# 2008 MSDN)

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 364458




相关文章:

相关链接: