Tag: idisposable

使用语句与IDisposable.Dispose()

我的理解是,一旦代码退出块,.NET中的using语句将调用一个IDisposable对象的Dispose()方法。 using语句是否还有其他的用法? 如果不是这样,那么以下两个代码示例看起来完全相同: Using Con as New Connection() Con.Open() 'do whatever ' End Using Dim Con as New Connection() Con.Open() 'do whatever ' Con.Dispose() 无论谁证实我是对的,我都会给出最好的答案,或者指出我错了,并解释了原因。 请记住,我知道某些类可以在Dispose()方法中做不同的事情 。 这个问题是关于using语句是否达到与调用对象的Dispose()方法完全相同的结果。

在.NET中重写Dispose(bool disposing)有什么意义?

如果我用C#编写一个实现IDisposable的类,为什么仅仅实现就不够用 public void Dispose(){ … } 处理任何非托pipe资源? 是 protected virtual void Dispose(bool disposing){ … } 总是必要的,有时是必要的,或者其他什么东西?

Unity 2.0和处理IDisposabletypes(尤其是使用PerThreadLifetimeManager)

我知道类似的问题被问了几次(例如: 这里 , 这里 , 这里和这里 ),但它是以前版本的Unity,答案取决于使用的LifetimeManager类。 文档说: Unity使用从LifetimeManager基类inheritance的特定types(统称为生存期pipe理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例。 好吧,听起来不错,所以我决定在生命周期pipe理中检查构build的实现。 我的结论是: TransientLifetimeManager – 不处理处理。 容器只能parsing实例,并不会跟踪它。 调用代码负责处理实例。 ContainerControlledLifetimeManager – configuration生命期pipe理器时的实例(=configuration容器时)。 提供hiearchy中所有容器共享的单例实例。 HierarchicalLifetimeManager – 从ContainerControlledLifetimeManager派生行为。 它在hiearchy(子容器)中为每个容器提供“单例”实例。 ExternallyControlledLifetimeManager – 不处理处理。 正确的行为,因为容器不是实例的所有者。 PerResolveLifetimeManager – 不处理处理。 它通常与TransientLifetimeManager相同,但它允许在parsing整个对象图时重用dependency injection的实例。 PerThreadLifetimeManager – 不处理MSDN中描述的处理。 谁负责处理? 内置PerThreadLifetimeManager是: public class PerThreadLifetimeManager : LifetimeManager { private readonly Guid key = Guid.NewGuid(); [ThreadStatic] private static Dictionary<Guid, object> […]

处理.NET IDisposable对象

我在C#中工作,我一直在using块来声明实现IDisposable对象,这显然是你应该做的。 但是,当我滑倒的时候,我看不出一个简单的方法。 Visual Studio似乎没有以任何方式表明这一点(我只是错过了什么?)。 我每次宣布什么都应该检查一下帮助,逐渐build立一个百科全书式的记忆,其中的物品是不是一次性的? 看起来不必要,痛苦,容易出错。 你如何处理这个? 编辑: 看一下相关的问题边栏,我发现了另外一个问题 ,清楚地表明Dispose()应该被对象的终结器调用。 所以,即使你从来没有自己调用它,它应该最终发生,这意味着如果你不使用(这是我认为我一直很担心),你将不会有内存泄漏。 唯一需要注意的是,垃圾收集器不知道对象将多less额外的内存作为非托pipe的东西,所以它不会有一个准确的想法,多less内存将通过收集对象被释放。 这将导致垃圾收集器的性能比平时更差。 简而言之,如果我错过了一个using ,那不是世界末日。 我只是希望能够给它带来至less一个警告。 (题外话:为什么没有特殊的降价链接到另一个问题?) 编辑: 好吧,不要吵闹 这是超级duper所有发射戏剧性的花栗鼠级重要的称之为Dispose()或我们都会死 。 现在。 因此,为什么这么容易 – 到底为什么它被允许 – 做错了? 你必须走出正确的道路。 像所有其他事情一样,会导致世界末日(显然)。 这么多封装,是吧? [偷懒,厌恶]

抛出ObjectDisposedException时,应该作为objectName传递什么?

在实现IDisposable时,我承诺在对象被处理后不应该调用的每个方法都应该抛出ObjectDisposedException 。 但是,应该传递给exception的构造函数的name对象的标准是什么?

yield(){}块内部的return语句在执行之前进行处理

我写了我自己的自定义数据层来坚持一个特定的文件,我用自定义的DataContext模式抽象它。 这是基于.NET 2.0框架(给定目标服务器的限制),所以即使其中一些看起来像LINQ到SQL,它不是! 我刚刚实现了一个类似的数据模式。 看下面的例子,我不能解释的情况的例子。 为了获得动物的所有实例 – 我这样做,它工作正常 public static IEnumerable<Animal> GetAllAnimals() { AnimalDataContext dataContext = new AnimalDataContext(); return dataContext.GetAllAnimals(); } 并在下面的AnimalDataContext()中实现GetAllAnimals()方法 public IEnumerable<Animal> GetAllAnimals() { foreach (var animalName in AnimalXmlReader.GetNames()) { yield return GetAnimal(animalName); } } AnimalDataContext()实现了IDisposable,因为我在那里有一个XmlTextReader,我想确保它快速清理。 现在,如果我把这样的使用语句中的第一个调用 public static IEnumerable<Animal> GetAllAnimals() { using(AnimalDataContext dataContext = new AnimalDataContext()) { return dataContext.GetAllAnimals(); } } 并在AnimalDataContext.GetAllAnimals()方法的第一行放置一个断点,并在AnimalDataContext.Dispose()方法的第一行放置另一个断点,然后执行… […]

你如何协调IDisposable和IoC?

我终于用C#围绕IoC和DI进行了包围,并且正在挣扎着一些边缘。 我正在使用Unity容器,但我认为这个问题更广泛地适用。 使用一个IoC容器来分配实现IDisposable的实例让我大吃一惊! 你怎么知道你应该Dispose()? 实例可能是为你创build的(因此你应该Dispose()它),或者它可能是一个实例的生命周期在其他地方pipe理(因此你最好不要)。 代码中没有任何内容告诉你,实际上这可能会根据configuration而改变! 这对我来说似乎是致命的。 任何IoC专家都可以描述处理这种歧义的好方法吗?

使用IDisposable来取消订阅事件

我有一个类来处理来自WinForms控件的事件。 基于用户在做什么,我正在引用该类的一个实例,并创build一个新的来处理同一个事件。 我需要首先从事件中退订旧实例 – 很简单。 如果可能的话,我想以非专有的方式做到这一点,这似乎是一个IDisposable的工作。 但是,大多数文档仅在使用非托pipe资源时才推荐使用IDisposable,这在此不适用。 如果我在Dispose()中实现了IDisposable和取消订阅这个事件,我是否在歪曲它的意图? 我应该提供一个Unsubscribe()函数并调用它吗? 编辑:这里有一些虚拟代码,显示我在做什么(使用IDisposable)。 我的实际实施涉及到一些专有的数据绑定(长篇故事)。 class EventListener : IDisposable { private TextBox m_textBox; public EventListener(TextBox textBox) { m_textBox = textBox; textBox.TextChanged += new EventHandler(textBox_TextChanged); } void textBox_TextChanged(object sender, EventArgs e) { // do something } public void Dispose() { m_textBox.TextChanged -= new EventHandler(textBox_TextChanged); } } class MyClass { EventListener […]

是否自动调用Dispose?

在C#中,foreach是否自动调用Dispose实现IDisposable的任何对象? http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx似乎表明它确实: *否则,集合expression式是实现System.IEnumerable的types,并且foreach语句的扩展是:Copy IEnumerator enumerator = ((System.Collections.IEnumerable)(collection)).GetEnumerator(); try { while (enumerator.MoveNext()) { ElementType element = (ElementType)enumerator.Current; statement; } } finally { IDisposable disposable = enumerator as System.IDisposable; if (disposable != null) disposable.Dispose(); }

stream作为WCF返回值 – 谁处置它?

假设我有以下的WCF实现: public Stream Download(string path) { FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read); return stream; } 谁负责处理退回的价值? 毕竟,networking故障可能发生,因此消费者可能无法处置它。