面试的时候问的一些问题

昨天,去参加了××公司的面试:我的第一次!尽管被BS了,但是还是厚着脸皮拿出来和大家分享一下,也请大家多多给我意见,大家讨论讨论,关于面试的一下东东!

我应聘的是QA,人家也没要我自我介绍,就直接问问题了,前面是用英文问的,问了:自己认为有什么优缺点等等:
大致问了我一些乱七八糟的东西,关于技术方面,我记得有这么两个问题:C#和Java的区别?  C#垃圾回收机制在什么时候会出现内存泄漏的问题?
我去的时候就匆匆忙忙地赶到,也没做什么准备。两个问题下来彻底的被bs了!  呵呵!

关于前者我只回答了,两个是不同公司推出的。后者我的回答是:当内存用完的时候,再去分配的话,就内存出错了(好像风马牛不相及),呵呵,太紧张了!

今天,网上找了下两种的区别,大致整理如下:
1.属性:
java中定义和访问均要用get和set方法,可以不成对出现。
c#中是真正的属性,定义时get和set也不必同时出现,访问时用.号即可。不用get,set

2.对象索引
就是对象数组
public Story this [int index] {

4.因为JAVA规定,在一个文件中只能有一个public类,而且这个类的名称必须与文件名一模一样,这是一个区别

5.在C#中,它是以Main方法来定位入口的.如果一个程序中没有一个名为Main的方法,就会出"找不到入口的错误".不要把Main写成main哟

6.C#预定义的简单数据类型比Java多。例如,C#有uint,即无符号整数

7.忘掉Java中的static final修饰符。在C#中,常量可以用const关键词声明
C#的设计者还增加了readonly关键词,readonly域只能通过初始化器或类的构造函数设置
8.公用类的入口点:c#是可以对Main进行重载(java中是main),允许有int返回值和空参数的Main

10.C#没有>>>移位操作符

11.goto关键词:
Java不用goto关键词。在C#中,goto允许你转到指定的标签。不过,C#以特别谨慎的态度对待goto,比如它不允许goto转入到语句块的内部。在Java中,你可以用带标签的语句加上break或continue取代C#中的goto。

12.int[] x = { 0, 1, 2, 3 };
int x[] = { 0, 1, 2, 3 };
但在C#中,只有第一行代码合法,[]不能放到变量名字之后。

13.与Java不同的是,C#允许为名称空间或者名称空间中的类指定别名:
using TheConsole = System.Console;

14.在Java中,包的名字同时也是实际存在的实体,它决定了放置.java文件的目录结构。在C#中,物理的包和逻辑的名称之间是完全分离的
.NET中包的实体称为程序集(Assembly)。每一个程序集包含一个manifest结构。manifest列举程序集所包含的文件,控制哪些类型 和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以 分割成多个文件。.NET的这种封装机制解决了DLL文件所面临的问题,即臭名昭著的DLL Hell问题。

15.在Java中,java.lang包是默认的包,C#中不存在默认的包

16.C#中的访问修饰符与Java中的基本对应,但多出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:

public:成员可以从任何代码访问。
protected:成员只能从派生类访问。
internal:成员只能从同一程序集的内部访问。
protected internal:成员只能从同一程序集内的派生类访问。
private:成员只能在当前类的内部访问。

17.由于C#中不存在final关键词,如果想要某个类不再被派生,你可以使用sealed关键词

18.与Java不同,C#中的接口不能包含域(Field)。
另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修饰符是非法的。例如,下面的C#接口将产生一个编译错误。

19.C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。在Java中没有与C# 中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标 类型;否则,它把变量引用设置成null。

20.C#仍旧保留了C++的内存手工管理方法,它适合在速度极端重要的场合使用,而在Java中这是不允许的

21.在C#中,所有的异常都从一个名为Exception的类派生

22.枚举器即enum类型(java无),把它作为一个变量值的类型使用,从而把变量可能的取值范围限制为枚举器中出现的值。

23.结构(Struct)与类很相似,而结构是一种值类型,它存储在栈中或者是嵌入式的,结构可以实现接口,可以象类一样拥有成员,但结构不支持继承

24.属性声明语法的第一部分与域声明很相似,第二部分包括一个set过程和/或一个get过程

25.传值方式:
在java中简单数据类型的值传参时,都以传值方式;
在c#中如果加ref则会以引用的方式传值(方法内部改变该参数,则外部变量一起跟着变);
加out与ref基本相同,但out不要求参数一定要初始化.

26.c#保留了指针。unsafe

27.代理:代理(delegate)可以看作C++或者其他语言中的函数指针
代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。
代理是从公共基类System.Delegate派生的引用类型。定义和使用代理包括三个步骤:声明,创建实例,调用。代理用delegate声明语法声明。


汇聚杭州外卖:外卖汇

posted on 2007-10-23 11:59 随风逝去(叶进) 阅读(4545) 评论(98)  编辑 收藏 网摘 所属分类: A. C#.NET

评论

#1楼 2007-10-23 12:20 亚历山大同志      

你的确应该被鄙视
  回复  引用  查看    

#2楼 2007-10-23 12:24 亚历山大同志      

================================================
1.属性:
java中定义和访问均要用get和set方法,可以不成对出现。
c#中是真正的属性,定义时get和set必须同时出现,房问时用.号即可。不用get,set
================================================
C#的属性 set get不必成对出现,而在jsp上访问bean的时候,属性不用加set,get就能访问
  回复  引用  查看    

#3楼 2007-10-23 12:30 DeViL→Ivy      

总结的还挺多的啊,不错   回复  引用  查看    

#4楼[楼主] 2007-10-23 12:35 随风逝去      

--引用--------------------------------------------------
亚历山大同志: 你的确应该被鄙视

--------------------------------------------------------
正在反省中!!!
  回复  引用  查看    

#5楼 2007-10-23 12:39 亚历山大同志      

@随风逝去
呵呵,好同志
  回复  引用  查看    

#6楼 2007-10-23 12:39 surrey[未注册用户]

C#的属性 可以只用get 的只读属性,
基础不行啊
  回复  引用    

#7楼 2007-10-23 12:45 金色海洋(jyk)      

还是挺乱的   回复  引用  查看    

#8楼 2007-10-23 12:45 A.Z*[未注册用户]

“C#垃圾回收机制在什么时候会出现内存泄漏的问题”


-〉

C# 垃圾回收

回收机制 会出现内存泄漏的问题
  回复  引用    

#9楼[楼主] 2007-10-23 12:48 随风逝去      

@亚历山大同志
没办法,去的时候在一个小房间等,然后发现里面的都是硕士,就我一个本科,还沾沾自喜了下。可是面了之后,连我自己都bs我自己了!
  回复  引用  查看    

#10楼[楼主] 2007-10-23 12:49 随风逝去      

--引用--------------------------------------------------
亚历山大同志: ================================================
1.属性:
java中定义和访问均要用get和set方法,可以不成对出现。
c#中是真正的属性,定义时get和set必须同时出现,房问时用.号即可。不用get,set
================================================
C#的属性 set get不必成对出现,而在jsp上访问bean的时候,属性不用加set,get就能访问
--------------------------------------------------------
确实不用成对出现,谢谢指正!
  回复  引用  查看    

#11楼[楼主] 2007-10-23 12:54 随风逝去      

--引用--------------------------------------------------
surrey: C#的属性 可以只用get 的只读属性,
基础不行啊
--------------------------------------------------------
是的,我刚刚自己试了下,不用成对使用get set也行的!

确实,我自己也发现了无数的缺陷!
  回复  引用  查看    

#12楼[楼主] 2007-10-23 12:56 随风逝去      

--引用--------------------------------------------------
A.Z*: “C#垃圾回收机制在什么时候会出现内存泄漏的问题”


-〉

C# 垃圾回收

回收机制 会出现内存泄漏的问题
--------------------------------------------------------
确实感觉好像不大会,在任何情况下.net都不回发生和c++一样的内存泄漏问题。可能就是在某些情况下会浪费些内存:
对象有引用,但是此对象已经不在使用的情况
  回复  引用  查看    

#13楼 2007-10-23 13:13 kiler      

C#垃圾回收机制在什么时候会出现内存泄漏的问题

问这东西有用吗?
  回复  引用  查看    

#14楼 2007-10-23 13:24 t-mac.NET      

C#和Java的区别


这种问题是一两句话就讲得清楚的问题吗???

再说这样问有意义吗,神经
  回复  引用  查看    

#15楼 2007-10-23 13:25 t-mac.NET      

不知楼主可否换一个皮肤,此皮肤看起来有点累哟   回复  引用  查看    

#16楼 2007-10-23 13:30 lovecherry      

protected internal:成员只能从同一程序集内的派生类访问?   回复  引用  查看    

#17楼 2007-10-23 13:41 Mirricle      

鄙视这样的问题,一个C#高手完全有可能没用过JAVA,他也就不知道两者的区别,况且,知道这个这些东西也没有任何意义。   回复  引用  查看    

#18楼 2007-10-23 13:50 芭蕉      

@kiler
可能那哥们是想问垃圾回收是不是什么都回收还是只回收托管的资源吧。个人猜测。
@随风逝去
Automatically implemented properties 确实是需要get,set成对出现的。少了谁都不行哦
  回复  引用  查看    

#19楼 2007-10-23 13:50 老刀把子      

C#和Java的区别 这个问题被人 问了N次。
觉得太泛了。

我都是回答: 不知道有什么区别。
反正爱怎么着,就怎么着。
  回复  引用  查看    

#20楼 2007-10-23 13:57 A.Z      

@老刀把子
你女儿还好吧
  回复  引用  查看    

#21楼 2007-10-23 14:09 代码乱了      

博主:你面试的公司是不是浙大网新啊?   回复  引用  查看    

#22楼 2007-10-23 14:19 鼠标王[未注册用户]

就算你知道了c#和JAVA的区别,那又能怎么样呢?能多干活吗???鄙视这样的公司。   回复  引用    

#23楼[楼主] 2007-10-23 14:23 随风逝去      

@t-mac.NET
呵呵! ok,换个变形金刚吧!! 呵呵,开玩笑,我会选个清爽的! 稍等!
  回复  引用  查看    

#24楼[楼主] 2007-10-23 14:26 随风逝去      

--引用--------------------------------------------------
老刀把子: C#和Java的区别 这个问题被人 问了N次。
觉得太泛了。

我都是回答: 不知道有什么区别。
反正爱怎么着,就怎么着。
--------------------------------------------------------
牛!
  回复  引用  查看    

#25楼[楼主] 2007-10-23 14:28 随风逝去      

--引用--------------------------------------------------
代码乱了: 博主:你面试的公司是不是浙大网新啊?
--------------------------------------------------------
是的,莫非是同路中人?
  回复  引用  查看    

#26楼 2007-10-23 15:26 贼鱼2[未注册用户]

内存泄漏指得就是heap中有了fragment,而fragment就是因为使用一些GCHandles(Pinned),而没有free掉, 在heap中留下了holes( GC并不收集这些holes)   回复  引用    

#27楼 2007-10-23 15:32 绿蚂蚁      

@随风逝去
--引用--------------------------------------------------
随风逝去: --引用--------------------------------------------------
surrey: C#的属性 可以只用get 的只读属性,
基础不行啊
--------------------------------------------------------
是的,我刚刚自己试了下,不用成对使用get set也行的!

确实,我自己也发现了无数的缺陷!
--------------------------------------------------------
你得知道get set到底是什么东西,不是说试了一下行,就记住行了,那样你总是被动
  回复  引用  查看    

#28楼 2007-10-23 15:38 巫云      

QA?很猛的啊   回复  引用  查看    

#29楼[楼主] 2007-10-23 15:38 随风逝去      

--引用--------------------------------------------------
绿蚂蚁: @随风逝去
--引用--------------------------------------------------
随风逝去: --引用--------------------------------------------------
surrey: C#的属性 可以只用get 的只读属性,
基础不行啊
--------------------------------------------------------
是的,我刚刚自己试了下,不用成对使用get set也行的!

确实,我自己也发现了无数的缺陷!
--------------------------------------------------------
你得知道get set到底是什么东西,不是说试了一下行,就记住行了,那样你总是被动
--------------------------------------------------------

非常谢谢绿蚂蚁指点!
  回复  引用  查看    

#30楼 2007-10-23 15:44 A.Z      

@贼鱼2

回收机制会出现内存泄漏的问题?在纯托管代码里,你要让gc放弃回收,只有当不正当的引用了对象,和回收机制有什么关系,这种问题忽悠人实在不厚道。
  回复  引用  查看    

#31楼[楼主] 2007-10-23 15:45 随风逝去      

--引用--------------------------------------------------
巫云: QA?很猛的啊
--------------------------------------------------------
只是在笔试的时候做了QA部分的题目,就通过了,所以面的是QA!
也许是QA猛,不是我猛
而且是QA太猛了,我招架不住啊!




呵呵
  回复  引用  查看    

#32楼 2007-10-23 15:49 9527[未注册用户]

亚历山大同志就会叫,你能答出来几个?
半瓶水的,摇的最欢。
  回复  引用    

#33楼 2007-10-23 16:02 胖子      

面试题好无聊   回复  引用  查看    

#34楼 2007-10-23 16:10 老刀把子      

@A.Z
你母亲好,我女儿就好。
  回复  引用  查看    

#35楼 2007-10-23 16:11 Sleet[未注册用户]

@Mirricle和@老刀把子
的话比较赞成

问了内存泄漏,那垃圾回收是微软写的,又不是那公司写的,问了也白问,难道有办法阻止?

C#写的厉害的人,有的人确实从高校出来就是一直用.NET开发,没去用过JAVA或了解很少,完全有可能不知道他们的区别,如果面试只是问这个,不如到网上看看,到时候背着给他们听就可以了

而且它们的区别,大的可以说几个,小的嘛,我想不止就几个吧,他们有多少时间可以听?除非他们发颠了
  回复  引用    

#36楼 2007-10-23 16:12 Sleet[未注册用户]

#30楼 2007-10-23 15:44 A.Z
@贼鱼2

回收机制会出现内存泄漏的问题?在纯托管代码里,你要让gc放弃回收,只有当不正当的引用了对象,和回收机制有什么关系,这种问题忽悠人实

------------------------------------
这个也赞成
  回复  引用    

#37楼 2007-10-23 16:13 Sleet[未注册用户]

中国的考试和面试,不是为了让你通过而设的,是为了难倒你而设的,所以忽悠人的公司,要么真的实力不行,要么就有点像要招又不招的样子,只是挂个招聘的牌子   回复  引用    

#38楼[楼主] 2007-10-23 16:19 随风逝去      

--引用--------------------------------------------------
Sleet: 中国的考试和面试,不是为了让你通过而设的,是为了难倒你而设的,所以忽悠人的公司,要么真的实力不行,要么就有点像要招又不招的样子,只是挂个招聘的牌子
--------------------------------------------------------
比较同意!
  回复  引用  查看    

#39楼 2007-10-23 16:20 缘易姿姿      

看了你第一个问题就。。。,而且后面给的答案也错了!
是应该好好学习下了!
  回复  引用  查看    

#40楼 2007-10-23 16:20 你就应该被BS[未注册用户]

3.C#中,不用任何范围修饰符时,默认的是protect,因而不能在类外被访问. ?????????????????????

什么玩意.

这破东东还放首页
  回复  引用    

#41楼 2007-10-23 16:23 缘易姿姿      

C#有unit,即无符号整数
。。。。
又错了,兄弟!
  回复  引用  查看    

#42楼 2007-10-23 16:26 Jeffrey Zhao      

汗,列这个区别有意义么……   回复  引用  查看    

#43楼 2007-10-23 16:30 寒星      

有必要在首页发多个类似的post嘛?   回复  引用  查看    

#44楼 2007-10-23 16:31 缘易姿姿      

9.在Java中,switch语句只能处理整数。但C#中的switch语句不同,它还能够处理字符变量。
-------------------
这个也不对吧?谁说java的switch只能处理整数?
  回复  引用  查看    

#45楼[楼主] 2007-10-23 16:46 随风逝去      

--引用--------------------------------------------------
Jeffrey Zhao: 汗,列这个区别有意义么……
--------------------------------------------------------
事物是相对的!
  回复  引用  查看    

#46楼[楼主] 2007-10-23 16:51 随风逝去      

--引用--------------------------------------------------
缘易姿姿: C#有unit,即无符号整数
。。。。
又错了,兄弟!
--------------------------------------------------------
C#确实是有uint,莫非缘易姿姿是指写错了(unit)
  回复  引用  查看    

#47楼[楼主] 2007-10-23 16:52 随风逝去      

--引用--------------------------------------------------
缘易姿姿: 9.在Java中,switch语句只能处理整数。但C#中的switch语句不同,它还能够处理字符变量。
-------------------
这个也不对吧?谁说java的switch只能处理整数?
--------------------------------------------------------
确实有误!
  回复  引用  查看    

#48楼 2007-10-23 17:01 缘易姿姿      

@随风逝去
C#的Unit是无符号整数 ?
C#的Unit是一个表示长度度量的结构体!

汗。。。不说了!费精神
  回复  引用  查看    

#49楼 2007-10-23 17:02 亚历山大同志      

看来9527和我有仇啊   回复  引用  查看    

#50楼 2007-10-23 17:09 9528[未注册用户]

亚历山大同志 ,你太高傲了。注意自己的言行。   回复  引用    

#51楼[楼主] 2007-10-23 17:15 随风逝去      

--引用--------------------------------------------------
缘易姿姿: @随风逝去
C#的Unit是无符号整数 ?
C#的Unit是一个表示长度度量的结构体!

汗。。。不说了!费精神
--------------------------------------------------------
是我打错了,Uint
  回复  引用  查看    

#52楼 2007-10-23 17:18 9529[未注册用户]

我不是9528。这位亚历山大是典型的喧哗流标题党,你不让他吸引眼球,人家吃啥啊   回复  引用    

#53楼 2007-10-23 17:19 GG99[未注册用户]

当然会出现内存泄漏了。WINDOWS下很多相关的操作并不都是完全在托管环境下运行的。比如你调用了某些COM的对象,而如果你在.NET应用程序中忘记了去显示的释放这些对象,那么,你的.NET应用程序同样会出现泄漏的问题。想想看,比如我们用OLEDB Connection,还是SharePoint的一些对象模型,不正确的调用Dispose方法,都会存在泄漏。如果你的应用程序并没有操作任何的非托管资源,那么我个人认为应该不会出现内存泄漏。毕竟GC是.NET平台的利器。当然,这个我还需要去验证验证。   回复  引用    

#54楼 2007-10-23 17:21 weef[未注册用户]

GC不能释放非托管资源,所以当用户没有自行销毁非托管资源时,有可能泄露。 例如 DbConnetion, FileStream等   回复  引用    

#55楼 2007-10-23 17:26 GG99[未注册用户]

另外看了一下,网上有微软的员工(应该是,blog.msdn.com里的人)做过一些case,有些内存泄漏是由Event Handler引起的,有些是由序列化引起的。这些操作似乎都和COM没有太多的关系。内存泄漏是应用程序中经常会一不留神就发生的问题。所以并不能因为有了GC,我们就可以去忽视它的存在。   回复  引用    

#56楼 2007-10-23 17:37 贼鱼2[未注册用户]

内存泄露的出现, 就是因为我们要和unmanaged code打交道, 用什么和方式呢? GCHandles! GCHandle有四种类型,其中short weekreference, long weekreference都用到了该DD, 在和native code互操作时,我们要确保一个对象没被移动过, 那么这时我们就需要使用pinned的GCHandle(在MethodTable上做点小改动,告诉GC我们不想让他移动),当然我们应该尽快把pinned的对象free掉。

这一部分是GC来处理的,难道不是回收机制的一部分吗?当我们不停不停的pin一个对象(比如large object)而并不去free他们,那么没过多久heap上就很多的holes留下了,从而导致没有memory可用!

如果你用过sos,那么!GCHandles/!GChandleLeak可以告诉一切

至于厚道忽悠否?我想我只是想发表下本人的意见,说的不对没学好,
总归相互学习

  回复  引用    

#57楼 2007-10-23 17:47 A.Z      

@贼鱼2
一般的程序是不需要和native code打交道的。
回收机制支持一种释放非托管资源的模式,就是传说中的dispose模式。
在一些需要手动释放的handle时,2.0已经有一个很好的模型来提供安全的释放机制。
平时写写asp.net程序的话,几乎是不用写这种代码。问出问题的人很高深,lz有幸的话也可以回答的高深点。
  回复  引用  查看    

#58楼 2007-10-23 17:50 A.Z      

@贼鱼2
你是ms大?
  回复  引用  查看    

#59楼 2007-10-23 18:17 贼鱼2[未注册用户]

很多时候要和native code打交道
比如
1.用window一些底层API,
2.本身.NET多处用到gchandles
所以ASP.NET也可能造成handle leak
而且dispose和GCHandle并不是一回事

回到问题本身, 一个object之所以能在heap上, 是由于GC并不按常规办事,这是gc的一部分,也是gc的责任所在

MS的不重要,很多N了blog中就多到很多的东西,还有 rotor, 想深入的,大家都可以稍微看看,平时很少留言,今天留言只是想发表意见,大家相互学习
  回复  引用    

#60楼 2007-10-23 18:37 买福彩吧[未注册用户]

人家是让你从大处比较一下,你却查了如此多小处的不同,我算是服了。   回复  引用    

#61楼 2007-10-23 18:56 jillzhang      

什么时候会造成内存泄漏
---------------------------------
如果作为我们平时讨论,您可以发散思维,想出很多例子和情形,
但作为面试,您应该知道这道题的初衷并不是让你举出成千上万的示例以证明自己丰富的开发经验。
这道题的正确的答案就是:当出现大量不被释放的资源导致内存不足的时候会产生内存泄漏,一种典型的例子就是大量使用数据库连接而没有及时释放。

我这种回答想必比各位的发散思维的讨论分数要高,这就是实际经验和考试之间的差距。有的人学的很少但考试分数可以很高,有的人满身本领却无从谈起。所以大家在面试或者笔试的时候,要做到的是切题,一语中的,而不是臭显,否则死的很惨。

不信的朋友,可以当我没说。

  回复  引用  查看    

#62楼[楼主] 2007-10-23 19:01 随风逝去      

--引用--------------------------------------------------
A.Z: @贼鱼2
一般的程序是不需要和native code打交道的。
回收机制支持一种释放非托管资源的模式,就是传说中的dispose模式。
在一些需要手动释放的handle时,2.0已经有一个很好的模型来提供安全的释放机制。
平时写写asp.net程序的话,几乎是不用写这种代码。问出问题的人很高深,lz有幸的话也可以回答的高深点。
--------------------------------------------------------
我经验有限,所以没有遇到过类似的问题。
  回复  引用  查看    

#63楼 2007-10-23 19:02 minidxer[未注册用户]

C#居然没有移位操作符!!!   回复  引用    

#64楼[楼主] 2007-10-23 19:05 随风逝去      

--引用--------------------------------------------------
jillzhang: 什么时候会造成内存泄漏
---------------------------------
如果作为我们平时讨论,您可以发散思维,想出很多例子和情形,
但作为面试,您应该知道这道题的初衷并不是让你举出成千上万的示例以证明自己丰富的开发经验。
这道题的正确的答案就是:当出现大量不被释放的资源导致内存不足的时候会产生内存泄漏,一种典型的例子就是大量使用数据库连接而没有及时释放。

我这种回答想必比各位的发散思维的讨论分数要高,这就是实际经验和考试之间的差距。有的人学的很少但考试分数可以很高,有的人满身本领却无从谈起。所以大家在面试或者笔试的时候,要做到的是切题,一语中的,而不是臭显,否则死的很惨。

不信的朋友,可以当我没说。


--------------------------------------------------------

学习了!
  回复  引用  查看    

#65楼 2007-10-23 19:49 A.Z*[未注册用户]

@贼鱼2
我估计你不是ms的,不过你好像是在ms的内网里。
  回复  引用    

#66楼 2007-10-23 21:00 怪怪      

@jillzhang
呵呵, 对于我这种野路子的理解, 你这种回答不叫内存泄露, 为什么呢, 因为对于GC来说, 我没有去释放它, 它决不能自己释放, 这是正确的做法.... 所以只能这题目出的有问题, 有误导.

贼鱼说的是一种, 另一种就是上面某兄弟说的类似于EventHandler的问题, 其实凡是存在相互间的委托依赖, 据说都有可能造成释放困难, 不知道有没有高人讲讲. 不过我理解, 只有因为这些原因造成我不想让内存被占用却被占用了, 才叫做内存泄露.



  回复  引用  查看    

#67楼 2007-10-23 21:08 亚历山大同志      

@minidxer
C#是有位移操作符的(如果你所说的移位就是我所说的位移的话)
  回复  引用  查看    

#68楼 2007-10-23 21:23 亚历山大同志      

@怪怪
c#这类语言照道理来说在不使用非安全代码的时候是不会有内存泄漏的情况,但是,有三种情况是意外,一个数据库操作一个流操作最后还有网络操作,这三类操作总结出来都是一种:调用了系统的API,结果照道理来说没存在引用的对象比如Connection,如果没有关闭链接,那么也无法回收。这三种情况下系统资源被占用了无法释放,但是在C#的程序中确实又无法通过引用访问这些对象了。所以微软会在C#中定义一个using结构。此类情况应该算做是资源泄漏。
还有一种情况是由于设计不当,有太复杂的引用结构,造成有一直存在的引用所以系统不回收的,那是设计问题。
而委托的情况是因为在使用委托来实现实例的方法并传递出去的时候实际上也相当于把这个实例的引用也传递出去了,如果这个委托的实例存在的话那么对象也不会被回收。
  回复  引用  查看    

#69楼 2007-10-23 21:23 @贼鱼2[未注册用户]

EventHandler造成'MemoryLeak',Tess倒有一post关于这个,当然其实并不是MemoryLeak(一般不会造成leak,本人觉得),有兴趣可以看看http://blogs.msdn.com/tess/,(http://blogs.msdn.com/tess/archive/2006/01/23/net-memory-leak-case-study-the-event-handlers-that-made-the-memory-baloon.aspx)

整个blog 里可以学到很多东西
  回复  引用    

#70楼 2007-10-23 21:36 怪怪      

@亚历山大同志
嗯这么说倒也有道理.., 因为确实存在"我想回收但回收不了了"..

委托的情况我指的是那种出现双向引用之类的导致该回收时却回收不了, 以前在哪儿看过, 给忘了.

@贼鱼2
THX :) [编辑一下: 看完了, 她说的这个还是因为没有 -=, 不是我说的那种情况..]
  回复  引用  查看    

#71楼 2007-10-23 23:03 代码乱了      

@随风逝去

--引用--------------------------------------------------
随风逝去: --引用--------------------------------------------------
代码乱了: 博主:你面试的公司是不是浙大网新啊?
--------------------------------------------------------
是的,莫非是同路中人?
--------------------------------------------------------
呵呵,由于合作的关系,网新的有几个工程师我认识啊
  回复  引用  查看    

#72楼 2007-10-23 23:51 neoragex2002      

GC“内存泄露"这道题目出题者表述不清,本意应该是考察有没有碰到过托管对象封装的非托管资源泄露,如GDI+资源、系统对象、数据库连接等。

gc自身是绝对不能出现内存泄露的,它之所以存在就是为了防止内存泄露。如果是pinned GCHandle,应该是由于非托管指针引用了托管堆上的数据,导致托管数据暂时不能被compat或sweep,这个不能算内存泄露,因为其数据还是能够被GC mark的。

托管对象双向引用的话,也是可以mark-sweep的,哪怕有多个对象,其依赖关系成环形,都可以mark-sweep。无法有效应对环形依赖,是引用计数(reference counting)的缺陷,而不是GC的缺陷。

gc mark数据的依据在于编译器所提供的root snapshot,即可以进行垃圾收集的安全场合中、当前控制流下的根数据快照,如全局数据、关键寄存器、数据流中的活动数据等,这些涉及数据流分析的根信息是必须由编译器提供的。当双向引用时,只要两个对象同时失去根数据引用,则两个对象将同时被收集。

至于设计得不好,导致数据无法释放,这是使用者的问题,不是GC的问题(把某个不要用的根引用置为null便ok,举手之劳)

综上,这种面试题,不用过分钻牛角尖,这只会让自己更说不清,想想哪些是比较常见的相关问题即可,自然能搞清楚题意。
  回复  引用  查看    

#73楼 2007-10-24 09:03 jillzhang      

@neoragex2002
凡是分布式应用程序,涉及到进程间通讯的,GC都无能为力,必须自己释放连接,数据库链接只是其中一种特例,所以严格来说,GC是保证大多数情况下不会造成托管程序的内存泄漏。至于您说不该占的被占用了,和我的说法如出一辙。我强调的是面试和笔试的技巧,面试的时候强调的是一语中的,言简意赅,任何判卷老师都是找关键字,关键字全了,满分!就这么简单。
所以作为一个被考试者,要修炼的除了平时的技术积累外,还要修改另外一种本领,就是一眼就知道考试题目的初衷。否则再发散,再创新,还是没有高分。
  回复  引用  查看    

#74楼 2007-10-24 09:19 亚历山大同志      

@jillzhang
回头测试下java是怎么做的,因为java里也应该会遇到相同的情况,而java没有using等类似的结构来保证释放。难道java不会泄露?
  回复  引用  查看    

#75楼 2007-10-24 09:52 激动[未注册用户]

激动,太激动了   回复  引用    

#76楼 2007-10-24 09:56 .NET BUFF[未注册用户]

gc自身是绝对不能出现内存泄露的?
GC当然不会, 内存泄露是相对heap来说的! GC是回收机制, 他负责处不去收集pinned的对象, GC并不对内存泄露的出现负责.

GCHandle最终由os release.这样的面试题我觉得不错, 要知道性能在很多场合时很重要的, 而内存泄露真是引起memory pressure的原因
  回复  引用    

#77楼 2007-10-24 10:02 bluebirdzx[未注册用户]

对 QA 问这个问题? 现在的QA是不是都是全能了。   回复  引用    

#78楼 2007-10-24 10:29 8l[未注册用户]

这种面试问题,有什么意义吗   回复  引用    

#79楼 2007-10-24 11:26 webqsoft[未注册用户]

3.C#中,不用任何范围修饰符时,默认的是protect,因而不能在类外被访问.
这是不对的
不要再搞不懂祸害首页了
  回复  引用    

#80楼 2007-10-24 11:54 沐枫      

这种面试,很有意义.
博主网上查的答案,还是错的.
人家不是问你两种语言的语法上面有什么区别.
  回复  引用  查看    

#81楼[楼主] 2007-10-24 12:15 随风逝去      

--引用--------------------------------------------------
沐枫: 这种面试,很有意义.
博主网上查的答案,还是错的.
人家不是问你两种语言的语法上面有什么区别.
--------------------------------------------------------
偶理解!!!
这个答案是其次,重要的是我把我自己亮出来让大家一起来bs
  回复  引用  查看    

#82楼 2007-10-24 13:37 亚历山大同志      

这类面试可以促使一个不求上进的青年成为一个奋发图强的优秀青年,其实是很有意义的   回复  引用  查看    

#83楼 2007-10-24 13:41 neoragex2002      

@jillzhang

数据库连接常用的无非named pipe/tcp-ip socket而已,前头各位把它单独提出来,应该是因为忘记释放连接实在太普遍吧,而且因为服务端应用特点(如一般长期不会重启、重负载等),其泄露现象显得特别突出。

其实这都是系统对象相关的操作了,跟是不是进程间通信没太多关系,如果没有及时释放,哪怕是GDI+、User对象、文件句柄甚至是DirectX / COM封装对象这些dd的不断积累都可导致系统资源overflow。只是因为其多涉及客户端应用,负载轻所以导致泄露的机会少,且一般不长期运行,加上重启app时系统本身也能完成部分系统对象的自动释放,所以症状没服务器端体现得那么显著而已。

总之,记住借别人的钱一定得主动地还,不管是谁的钱,都不要等到别人来催你的时候再还(GC),或者是心存侥幸,事情就简单多了。
  回复  引用  查看    

#84楼 2007-10-24 13:54 A.Z*[未注册用户]

@亚历山大同志
直到满腹经纶可以写书,当老师,职业的新高潮...
我是一个实用主义者,如果asp.net开发开发,只要可以上手不一定要回答对有些问题,比如c#和java在语言层面的比较,一般我觉得这类问题不厚道。

如果是一个专业的以开发商业控件为主的公司,或者在.net平台上的其他应用,倒是有必要考察各种情景的应对能力。
  回复  引用    

#85楼 2007-10-24 14:43 装配脑袋      

凡是问我语言特性某某和某某有什么区别的问题,我一律从超细节的地方一条一条超详细地给他说,直到把他说晕为止!这种Java和C#区别我绝对让他2分钟内喊停。最讨厌这种问题了,根本不知道想要考察什么。   回复  引用  查看    

#86楼[楼主] 2007-10-24 14:57 随风逝去      

--引用--------------------------------------------------
亚历山大同志: 这类面试可以促使一个不求上进的青年成为一个奋发图强的优秀青年,其实是很有意义的
--------------------------------------------------------
同志好像铉外有音啊?
  回复  引用  查看    

#87楼 2007-10-24 15:23 neoragex2002      

@装配脑袋
别人是绝不会拿语言特性来面你的,面试的也不想被被面试的BS啊,哈哈哈:D 考考试题倒还没啥,谈不拢才最郁闷,你做的他不感兴趣,他问的你不了解,鸡同鸭讲,双方都累... so,先找共同点,越有趣越好,然后再找差异,同样越有趣越好,then you're hired!
  回复  引用  查看    

#88楼 2007-10-24 15:46 亚历山大同志      

@装配脑袋
赞,有性格我稀饭
  回复  引用  查看    

#89楼 2007-10-25 11:34 青雉[未注册用户]


如果我面试的是C#,

我怎么知道JAVA跟C#有那么多的区别吗

难道学C#之前,一定要知道JAVA跟C#的区别吗
  回复  引用    

#90楼 2007-10-25 12:33 9527[未注册用户]

亚历山大同志 估计是CEO,天天不用上班,泡在博客园上。
自己发的帖子还不允许匿名评论,BS!
  回复  引用    

#91楼 2007-10-25 13:01 89757[未注册用户]

@9527
亚历山大同志 是比较厉害的,这点你得承认!
  回复  引用    

#92楼 2007-10-25 13:23 半山旅客

有魄力。。。   回复  引用    

#93楼 2007-10-25 13:55 9527[未注册用户]

89757 ,哪里来的马甲,我怎么看不出来厉害?半瓶水而已。   回复  引用    

#94楼 2007-10-26 09:53 stevegu1978[未注册用户]

有没有比较正确点的回答呢,谁来说下,求?   回复  引用    

#95楼 2008-01-29 11:04 破曉之陽      

QA 是不是问题和答案 啊。   回复  引用  查看    

#96楼 2008-01-29 12:04 Jeff Weng      

呵呵,想起9年前我参加H公司的面试,问了8个问题,我只回答上4道,结果...面试成绩排名第三,就这样,进了H公司...   回复  引用  查看    

#97楼 2008-03-07 23:25 笑疯^_^      

能被叫你去面视已经很不错了啊   回复  引用  查看    

#98楼 2008-08-04 15:57 荔橙伊珊雨      

呵呵。   回复  引用  查看    

#99楼 2008-08-08 15:45 Magnetic Material[未注册用户]

偶不是搞程序的,都不懂   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 934272




相关文章:

相关链接:

公告

MSNadaiye@hotmail.com
From 2008.3.22
     I have read:
     I am reading......:
C#和.NET 2.0实战 平台、语言与框架
修改代码的艺术 Programing ASP.NET JavaScript高级程序设计 IT新闻:
肩膀一直在痛!

导航

统计

  • 随笔 - 80
  • 文章 - 0
  • 评论 - 488
  • 引用 - 2

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类(73)

收藏夹(100)

Blogs

好吃的

最新随笔

积分与排名

  • 积分 - 114042
  • 排名 - 478

最新评论

阅读排行榜

评论排行榜

Free Web Counter
Free Web Counter