Tag: idisposable

在using块中使用’as IDisposable’

编辑:我的问题不是关于使用块及其工作原理。 我的问题是关于两种方法的区别,如下所示。 我正在阅读CQRS旅程指南,我不明白这行代码: using (repo as IDisposable) 那是什么意思? 为什么将它用作IDisposable? 在典型的使用块中,不需要将其用作IDisposable: using (var repo = this.respositoryFactory()) { // … } 知道为什么作者以第一种方式而不是第二种方式编写它? 这是代码出现的方法: private Conference.Web.Public.Models.Conference GetConference(string conferenceCode) { var repo = this.repositoryFactory(); using (repo as IDisposable) { var conference = repo.Query() .First(c => c.Code == conferenceCode); var conferenceModel = new Conference.Web.Public.Models.Conference { Code = conference.Code, Name = […]

关闭文件而不使用

我有一个类从一个文件流中读取数据并写入另一个文件流。 我关注在closeFiles()处理完成后关闭流。 你如何处理一个流的处理可能引发exception停止处理另一个流的可能性。 我应该近距离呼叫并处理流或只是一个? 如果我从流处理中捕获任何错误然后继续移动和删除文件会发生什么,如lastOperation()中所示? 在一个完美的世界中,我想在c ++样式初始化列表中使用using语句,但我很确定在c#中不可能。 编辑 :感谢快速反应的人。 所以我应该做的是从IDisposable派生,然后更改构造函数并添加这样的两个处理方法?: ~FileProcessor() { Dispose(true); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { sw.Flush(); } closeFiles(); disposed = true; } } 这基本上就是我在做的事情: class FileProcessor { private string in_filename; private string out_filename; private StreamReader sr; private StreamWriter […]

处理存储在公共静态字段中的IDisposable对象

如果一个类有一个实现IDisposable的实例字段,那么包含的类实现了IDisposable和类,它从Dispose方法中调用Dispose方法。 public class A : IDisposable { public System.Drawing.Font font = new Font(“Arial”, 10.0f); public void Dispose() { font.Dispose() } } (我知道我没有正确处理配置模式,但是样本代码应该足够好) 如果该字段是静态字段,那么调用字段的Dispose应该在哪里? public class B { public static System.Drawing.Font font = new Font(“Arial”, 10.0f); } 我可以使B类实现IDisposable并调用font.Dispose但如果稍后再使用B.font会导致问题。 除了你必须记住访问静态方法的dispise,你需要创建一个实例来调用Dispose。 我也可以创建一个静态Dispose方法,但是用户必须记住调用Dispose并且必须确保它们是程序中它的最后一个用户。

如果初始化失败,如何将IDisposable对象传递给在C#中处理的基础构造函数参数?

如果我使用base(…)构造将IDisposable对象传递给基类构造函数,我会在FxCop中触发一个关于放弃IDisposable 。 警告偶尔在其他地方有用,所以我不想禁用它,但我意识到我不知道我应该使用的确切语义。 基础构造函数是否有责任将其主体包装在try / catch中,以确保在exception的情况下正确处理IDisposable事物? 相关问题: CA2000在C#中将对象引用传递给基础构造函数 通过构造函数链传递IDisposable对象

Autofac,IDisposable和手动呼叫。在某些情况下解决

我在IDisposable对象和使用Autofac时发布了一般指南问题: dependency injection和IDisposable 。 不幸的是,我没有考虑到我们项目中的一个特定场景,它实际上是一个独立的问题,所以会在这里问: 我有一个Repository对象来管理其中的会话对象的生命周期。 因此,Repository对象是IDisposable并且销毁会话(Repository在构造时注入工厂委托,在第一次使用期间实例化会话,并且如果session不为null则在IDisposable中销毁会话)。 根据上面对StackOverflow问题的引用,我理解注入了我的Repository对象的任何对象都不应该实现IDisposable,因为Autofac会处理我的存储库,如果它正在注入它们。 每个提到的StackOverflow线程,我已经开始清理我的对象中的IDisposable用法,直到我偶然发现下面显示的NotificationPublisher类。 有一些地方喜欢它的类注入了IComponentContext的实现作为工厂。 解析在函数中手动执行,因为代码库不知道在运行时之前需要注入哪个处理程序。 public class NotificationPublisher : INotificationPublisher { private readonly IComponentContext _container; private readonly INotificationManager _notificationManager; public NotificationPublisher(IComponentContext container, INotificationManager notificationManager) { _container = container; _notificationManager = notificationManager; } public IEnumerable Publish(Account account, INotificationInitiator owner, INotificationEntity entity, Int32 severity, CheckCycleContext monitoringContext) { var alertSubscriptions = _notificationManager.GetAlertSubscriptions(account, […]

在c#中创建一个IDisposable类,在完成时清理SqlConnection

在回答上一个问题时,有人建议: 让SqlConnection成为你的类的成员变量,但是当类处理时,使类IDisposable并处理SqlConnection 我已经把这个建议的实现放在一起(下面),但是想检查一下这个实现是否正确(显然它除了打开连接之外当前没有做任何事情但是想法是那里会有使用连接的方法哪个能够依赖现有的和开放的。 public class DatabaseRecord : IDisposable { protected SqlConnection connection; public DatabaseRecord() { connection = new SqlConnection(“ConnectionString”); connection.Open(); } // IDisposable implementation private bool disposed; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { connection.Dispose(); } disposed = true; } } // Destructor ~DatabaseRecord() […]

具有IDisposable的无限状态机

假设我有一个无限状态机来生成随机md5哈希: public static IEnumerable GetHashes() { using (var hash = System.Security.Cryptography.MD5.Create()) { while (true) yield return hash.ComputeHash(Guid.NewGuid().ToByteArray()); } } 在上面的例子中,我使用using语句。 是否会调用.Dispose()方法? CQ,未管理的资源是否会被释放? 例如,如果我按如下方式使用机器: public static void Test() { int counter = 0; var hashes = GetHashes(); foreach(var md5 in hashes) { Console.WriteLine(md5); counter++; if (counter > 10) break; } } 由于hashes变量将超出范围(并且我假设已收集垃圾),是否会调用dispose方法来释放System.Security.Cryptography.MD5使用的资源,或者这是内存泄漏?

为什么处理一个肯定会很快被处理掉的物体呢?

假设我有一个例如点击按钮的程序。 我创建了一个Graphics对象。 显然我应该处理它,例如 using(Graphics gr__=this.CreateGraphics()) { } 或者在try-catch-finally的finally中调用.Dispose() 。 但考虑到程序将很快结束。 假设我在程序的本地创建它(不是全局的,不是在使用中)。 但是当地的程序。 然后肯定像任何其他变量一样,它会在程序完成后自动处理掉,不是吗? 那么为什么我手动/明确地处理它很重要? 为什么我不能像任何其他变量一样自动垃圾收集? 当然它可能比’int’大一点,但它可能仍然很小,并且不会长时间记忆,因为程序结束如此之快。 甚至可能是在完成使用或调用Dispose() ,程序结束,因此我认为如果变量是程序的本地变量,它将被处理掉。 那么为什么要使用Dispose() / using的显式垃圾收集呢?

为什么不处理/关闭SqlConnection?

鉴于方法: internal static DataSet SelectDataSet(String commandText, DataBaseEnum dataBase) { var dataset = new DataSet(); SqlConnection sqlc = dataBase == DataBaseEnum.ZipCodeDb ? new SqlConnection(ConfigurationManager.AppSettings[“ZipcodeDB”]) : new SqlConnection(ConfigurationManager.AppSettings[“WeatherDB”]); SqlCommand sqlcmd = sqlc.CreateCommand(); sqlcmd.CommandText = commandText; var adapter = new SqlDataAdapter(sqlcmd.CommandText, sqlc); adapter.Fill(dataset); return dataset; } 为什么sqlc(SqlConnection)在调用方法超出范围后没有处理/关闭,或者sqlc没有更多的引用? 编辑1:即使将其包装在使用中,我仍然可以看到连接使用(我已关闭连接池): SELECT DB_NAME(dbid) as ‘Database Name’, COUNT(dbid) as ‘Total Connections’ FROM […]

CA1001 Visual Studio 2012代码分析警告。 这是什么意思?

它并不重要,但我想弄清楚它告诉我什么,这是一个合理的警告吗? 有人可以用简单的语言解释这个错误吗? CA1001拥有一次性领域的类型应该是一次性的 在’MemVoteManager’上实现IDisposable,因为它创建了以下IDisposable类型的成员:’CongressDBEntities’。 如果先前发布了“MemVoteManager”,则将实现IDisposable的新成员添加到此类型将被视为对现有使用者的重大更改。 public class MemVoteManager : AbstractDataManager, IMemVoteManager { private CongressDBEntities context = new CongressDBEntities(); public int AddMemVote(tMemVoteScore mvs) { //Insert Model context.tMemVoteScores.Add(mvs); context.SaveChanges(); int newPK = mvs.MemVoteScoresID; //Update funky column ID with PK as well var memVoteItem = (from m in context.tMemVoteScores where m.MemVoteScoresID == newPK select m).SingleOrDefault(); memVoteItem.ID = memVoteItem.MemVoteScoresID; […]