在C#中,foreach是否会在任何实现IDisposable的对象上自动调用Dispose?http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx似乎表明它确实如此:*否则集合表达式是实现了System.IEnumerable的类型,foreach语句的展开为:复制IEnumeratorenumerator=((System.Collections.IEnumerable)(collection)).GetEnumerator();try{while(enumerator.MoveNext()){ElementTy
在C#中,foreach是否会在任何实现IDisposable的对象上自动调用Dispose?http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx似乎表明它确实如此:*否则集合表达式是实现了System.IEnumerable的类型,foreach语句的展开为:复制IEnumeratorenumerator=((System.Collections.IEnumerable)(collection)).GetEnumerator();try{while(enumerator.MoveNext()){ElementTy
是否有关于谁应该调用Dispose()的任何指导或最佳实践当一次性对象被传递到另一个对象的方法或构造函数时?这里有几个例子来说明我的意思。IDisposable对象被传递给一个方法(它应该在完成后处理它吗?):publicvoidDoStuff(IDisposabledisposableObj){//DosomethingwithdisposableObjCalculateSomething(disposableObj)disposableObj.Dispose();}IDisposable对象被传递到一个方法中并保留一个引用(它应该在处理MyClass时处理它吗?):publiccl
是否有关于谁应该调用Dispose()的任何指导或最佳实践当一次性对象被传递到另一个对象的方法或构造函数时?这里有几个例子来说明我的意思。IDisposable对象被传递给一个方法(它应该在完成后处理它吗?):publicvoidDoStuff(IDisposabledisposableObj){//DosomethingwithdisposableObjCalculateSomething(disposableObj)disposableObj.Dispose();}IDisposable对象被传递到一个方法中并保留一个引用(它应该在处理MyClass时处理它吗?):publiccl
在C#中,如果一个类(例如管理器类)没有资源,那么拥有它:IDisposable有什么好处吗?简单的例子:publicinterfaceIBoxManager{intaddBox(Boxb);}publicclassBoxManager:IBoxManager{publicintaddBox(Boxb){using(dataContextdb=newdataContext()){db.Boxes.add(b);db.SaveChanges();}returnb.id;}}如果BoxManager也实现了IDisposable,在内存使用方面会有什么好处吗?公共(public)类BoxM
在C#中,如果一个类(例如管理器类)没有资源,那么拥有它:IDisposable有什么好处吗?简单的例子:publicinterfaceIBoxManager{intaddBox(Boxb);}publicclassBoxManager:IBoxManager{publicintaddBox(Boxb){using(dataContextdb=newdataContext()){db.Boxes.add(b);db.SaveChanges();}returnb.id;}}如果BoxManager也实现了IDisposable,在内存使用方面会有什么好处吗?公共(public)类BoxM
注意这不是关于如何在C#中实现或模拟ducktyping的问题...几年来,我一直认为某些C#语言功能依赖于语言本身定义的数据结构(对我来说,这似乎总是奇怪的先有鸡还是先有蛋的情况)。例如,我的印象是foreach循环只能用于实现了IEnumerable的类型。从那时起我开始明白C#编译器使用鸭子类型(ducktyping)来确定一个对象是否可以在foreach循环中使用,寻找GetEnumerator方法而不是IEnumerable。这很有意义,因为它消除了先有鸡还是先有蛋的难题。我有点困惑,为什么usingblock和IDisposable似乎不是这种情况。编译器不能使用鸭子类型(
注意这不是关于如何在C#中实现或模拟ducktyping的问题...几年来,我一直认为某些C#语言功能依赖于语言本身定义的数据结构(对我来说,这似乎总是奇怪的先有鸡还是先有蛋的情况)。例如,我的印象是foreach循环只能用于实现了IEnumerable的类型。从那时起我开始明白C#编译器使用鸭子类型(ducktyping)来确定一个对象是否可以在foreach循环中使用,寻找GetEnumerator方法而不是IEnumerable。这很有意义,因为它消除了先有鸡还是先有蛋的难题。我有点困惑,为什么usingblock和IDisposable似乎不是这种情况。编译器不能使用鸭子类型(
最近在和同事讨论Dispose的值(value)和实现IDisposable的类型.我认为实现IDisposable是有值(value)的对于应该尽快清理的类型,即使没有要清理的非托管资源.我的同事有不同的想法;实现IDisposable如果您没有任何非托管资源,则不需要,因为您的类型最终将被垃圾收集。我的论点是,如果您想尽快关闭ADO.NET连接,那么实现IDisposable和usingnewMyThingWithAConnection()会有意义。我的同事回答说,在幕后,ADO.NET连接是非托管资源.我对他的回复是一切最终都是非托管资源.我知道recommendeddispos
最近在和同事讨论Dispose的值(value)和实现IDisposable的类型.我认为实现IDisposable是有值(value)的对于应该尽快清理的类型,即使没有要清理的非托管资源.我的同事有不同的想法;实现IDisposable如果您没有任何非托管资源,则不需要,因为您的类型最终将被垃圾收集。我的论点是,如果您想尽快关闭ADO.NET连接,那么实现IDisposable和usingnewMyThingWithAConnection()会有意义。我的同事回答说,在幕后,ADO.NET连接是非托管资源.我对他的回复是一切最终都是非托管资源.我知道recommendeddispos