Tag: using语句

在使用C#中返回用于使用的变量

我正在使用using语句中的using语句返回我正在创建的变量(听起来很有趣): public DataTable foo () { using (DataTable properties = new DataTable()) { // do something return properties; } } 这将Dispose属性变量?? 这样做后仍然得到这个警告: 警告34 CA2000:Microsoft.Reliability:在方法’test.test’中,在对所有引用超出范围之前,在对象’properties’上调用System.IDisposable.Dispose。 有任何想法吗? 谢谢

事件触发前的对象处理和垃圾收集

一段代码由我正在与之交谈的人提出: private void DownloadInformation(string id) { using (WebClient wc = new WebClient()) { wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompleted); wc.DownloadStringAsync(new Uri(“http://www.fake.com/” + id)); } } 以上是此简化版: (我已获得作者的许可发布图片。) 令我烦恼的是,该代码附带了一个事件处理程序,调用了DownloadStringAsync() ,然后using结束,在WebClient上调用了Dispose() 。 在DownloadStringAsync()完成和DownloadStringCompleted事件触发之前,是否有任何东西会阻止WebClient被using甚至垃圾收集掉? 有一个更新的方法, DownloadStringTaskAsync() ,我认为它与await一起使用: private async Task DownloadInformation(string id) { using (WebClient wc = new WebClient()) { wc.DownloadStringCompleted += DownloadStringCompleted; await wc.DownloadStringTaskAsync(new Uri(“http://www.fake.com/” + id)); } } […]

如何确定是否正在处理.NETexception?

我们正在调查C#中的编码模式,其中我们要使用带有特殊类的“using”子句,其Dispose()方法根据“using”主体是正常退出还是exception退出而执行不同的操作。 据我所知,CLR会跟踪当前正在处理的exception,直到它被“catch”处理程序消耗为止。 但是,这些信息是否以任何方式暴露给代码访问并不完全清楚。 你知道它是否,如果是,如何访问它? 例如: using (var x = new MyObject()) { x.DoSomething(); x.DoMoreThings(); } class MyObject : IDisposable { public void Dispose() { if (ExceptionIsBeingHandled) Rollback(); else Commit(); } } 这看起来几乎像System.Transactions.TransactionScope ,除了成功/失败不是通过调用x.Complete()来确定,而是基于using正文是否正常退出。

调用Dispose()vs对象超出范围/方法完成

我有一个方法,里面有一个try / catch / finall块。 在try块中,我声明SqlDataReader如下: SqlDataReader aReader = null; aReader = aCommand.ExecuteReader(); 在finally块中,手动处理的对象是在类级别设置的对象。 那么实现IDisposable的方法中的对象,比如上面的SqlDataReader,它们会被自动处理掉吗? 在while循环执行后,在aReader上调用Close()以获取读取器的内容(应该是Dispose(),因为它调用Close())。 如果没有调用Close(),当方法完成或对象超出范围时,是否会自动关闭/处置此对象? 编辑:我知道using()语句,但有些情况让我感到困惑。 谢谢 谢谢

在处理时,没有变量的using语句会做什么?

我一直习惯使用变量和赋值。 现在我喜欢这个类DbProviderConnection: public class DbProviderConnection : IDisposable { public DbConnection Connection { get; set; } public DbTransaction Transaction { get; set; } public DbTransaction BeginTransaction() { Transaction = Connection.BeginTransaction(); return Transaction; } //… and so on } 现在我想像这样使用它: using (DbProviderConnection cnctn = _planDb.CreateOpenConnection()) { using (cnctn.BeginTransaction()) { //… cnctn.Transaction.Commit(); } } 我的问题是:是否调用了DbProviderConnection.Transaction.Dispose ?