Tag: idisposable

处理IDisposable的最佳实践

我有一个类层次结构,每个成员可以创建IDisposable对象。 我将List属性添加到此层次结构中的基类,我在创建时向其添加任何一次性对象。 根Dispose方法遍历此列表并为其列表中的每个项调用Dispose并清除列表。 在应用程序中,我显式调用顶层对象的Dispose方法,导致处理级联层次结构。 这有效,但还有更好的方法吗? 我是否在无意中重复了框架中已有的某些function? (注意 – 有问题的对象的生命周期不能将它们包装在一个using块中,或者在创建它们的同一个using处理它们。) 编辑 只是为了澄清 – 我只是保留那些需要保留的对象。 有些是在创建它们的同一方法中处理掉的,但是很多都是以不可能的方式使用的。

如何在WPF中使用一次性视图模型?

如果视图模型引用非托管资源或者在调度程序计时器上有事件处理程序(如处理已经过时),我该如何确保它们得到妥善处理。 在第一种情况下,终结者是一种选择,虽然不是理想的,但在后者中,它永远不会被称为。 如何在视图模型中不再附加视图时如何判断。

显式实现IDisposable

虽然在SO上有很多关于IDisposable的问答,但我还没有找到答案: 我通常遵循这样的做法:当我的一个类拥有一个IDisposable对象时,它也实现了IDisposable并在拥有的对象上调用Dispose 。 但是最近我遇到了一个明确实现IDisposable的类,因此阻止我直接调用Dispose强制我强制转换它,我觉得这很烦人且没必要。 所以问题是:为什么以及何时想要使用IDisposable的显式接口实现? 我知道明确实现接口有完美的正当理由,但就IDisposable ,原因并不十分清楚。

LINQ如何在using语句中延迟执行

想象一下,我有以下几点: private IEnumerable MyFunc(parameter a) { using(MyDataContext dc = new MyDataContext) { return dc.tablename.Select(row => row.parameter == a); } } private void UsingFunc() { var result = MyFunc(new a()); foreach(var row in result) { //Do something } } 根据文档,linq执行将推迟直到我实际枚举结果,该结果发生在foreach的行中。 但是,using语句应强制在MyFunct()调用结束时可靠地收集对象。 实际发生了什么,处理器何时运行和/或结果运行? 我唯一能想到的是延迟执行是在编译时计算的,所以实际的调用由编译器移动到foreach的第一行,导致使用正确执行,但直到foreach行才运行? 有没有可以提供帮助的古茹? 编辑: 注意:此代码确实有效,我只是不明白如何。 我做了一些阅读,我在我的代码中意识到我已经调用了ToList()扩展方法,当然这个方法枚举了结果。 勾选答案的行为对于回答的实际问题是完全正确的。 对不起任何困惑。

如何强制MemoryStream占用释放内存?

我有以下代码: const int bufferSize = 1024 * 1024; var buffer = new byte[bufferSize]; for (int i = 0; i < 10; i++) { const int writesCount = 400; using (var stream = new MemoryStream(writesCount * bufferSize)) { for (int j = 0; j < writesCount; j++) { stream.Write(buffer, 0, buffer.Length); } stream.Close(); } } 我在32位机器上运行。 […]

当Ninject用作依赖项解析器时,如何在asp.net mvc3 App中处理DbContext(或对象)

对于这个Demo,我创建了一个虚假的Database +存储库,如下所示 假Db +存储库 public interface IDemoRepository { string[] GetUsers(); } public class DemoRepository : IDemoRepository, IDisposable { public string[] GetUsers() { string[] Users = { “Robert”,”Linda”,”Jack”}; return Users; } public void Dispose() { //do nothing throw new Exception(“Disposed is called”); } } 我的控制器看起来如此 public class TestController:Controller { protected IDemoRepository _repository; public BaseController(IDemoRepository repository) { […]

如何对终结器进行unit testing?

我有以下类,它是IDisposable对象的装饰器(我省略了它添加的东西),它本身使用一个通用模式实现IDisposable : public class DisposableDecorator : IDisposable { private readonly IDisposable _innerDisposable; public DisposableDecorator(IDisposable innerDisposable) { _innerDisposable = innerDisposable; } #region IDisposable Members public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion ~DisposableDecorator() { Dispose(false); } protected virtual void Dispose(bool disposing) { if (disposing) _innerDisposable.Dispose(); } } 我可以轻松测试调用Dispose()时是否Dispose()了innerDisposable : [Test] public void Dispose__DisposesInnerDisposable() { var mockInnerDisposable […]

如何查找实现IDisposable的所有类?

我正在开发一个大型项目,我的任务之一是消除可能的内存泄漏。 在我的代码中,我注意到几个IDisposable项目没有被处理,并已修复。 但是,这引出了一个更基本的问题,如何找到我的项目中使用 IDisposable的所有类? (不是自定义创建的类,而是已使用的标准库类)。 我已经找到了一个实现IDisposable的不太明显的类(DataTable实现了MarshalByValueComponent,它inheritance了IDisposable)。 现在,我通过使用MSDN手动检查任何可疑的类,但是在某些方面我可以自动执行此过程吗?

结构和IDisposable

我想知道为什么不编译? public static void Main(string[] args) { using (MyStruct sss = new MyStruct()) { sss.s = “fsdfd”;// Cannot modify members of ‘sss’ because it is a ‘using variable’ //sss.Set(12); //but it’s ok } } public struct MyStruct : IDisposable { public int n; public string s; public void Set(int n) { this.n = n; } […]

注入存储库上的IDisposable

我有以下ADO .Net存储库 public class Repository : IRepository, IDisposable { private readonly IUnitOfWork UnitOfWork; private SqlConnection Connection; public Repository(IUnitOfWork unitOfWork, connectionString) { UnitOfWork = unitOfWork; Connection = new SqlConnection(connectionString); Connection.Open(); } public MyObject FindBy(string userName) { //…Ado .Net command.ExecuteReader, etc. } } 此存储库向IOS容器注入域服务,使用方式如下: public class UserDomainService : IUserDomainService { private readonly IRepository Repository; public UserDomainService(IRepository repository) […]