Tag: using

如何在.Net 1.1中的FileStream上实现IDisposable

这可能看起来像一个问题,但我正在看这个,因为我听到有人声称你必须在FileStream上调用Close(),即使它在一个使用块中(并且他们有代码调用Close())就在街区尽头)。 我知道Close()意味着调用Dispose(),但我认为我看起来更深,因为这是.Net 1.1代码,我的大部分经验都是2.0。 让我印象深刻的是,FileStream的MSDN文档为.Net 2.0启用了Dispose()和Dispose(bool),但只为.Net 1.1启用了Dispose(bool)。 我认为这可能是一个疏忽,所以我使用Reflector来查看一个程序集 – 我也看到Dispose(bool),但没有Dispose()。 它是否正确? 如果是这样,这里的故事是什么? FileStream在一个使用块中工作 – 我认为它必须实现IDisposable,据我所知,它只声明Dispose()。 是否有一些编译器魔法正在进行,或者我错过了隐藏的Dispose()实现(可能是调用Dispose(true)或Dispose(false)?) 最后(没有双关语),你能否确认在使用块中使用FileStream的范围将在.Net 1.1中的范围出口处关闭流? [编辑] 只是为了澄清,这是C#代码。 我知道VB.Net在.Net 2.0之前没有得到using语句,但我的理解是C#在1.1中有它(我的1.1代码在这里有它并编译)

好奇的C#使用语句扩展

我跑ildasm发现这个: using(Simple simp = new Simple()) { Console.WriteLine(“here”); } 生成与此等效的IL代码: Simple simp = new Simple(); try { Console.WriteLine(“here”); } finally { if(simp != null) { simp.Dispose(); } } 而问题是为什么它会在最后检查null? 只有在执行try块时才会执行finally块,并且只有在Simple构造函数成功时才会执行try块(即不抛出exception),在这种情况下simp将为非null。 (如果担心在Simple构造函数和try块的开头之间可能会出现一些干预步骤,那么这确实是一个问题,因为可能会抛出一个exception,阻止finally块执行。)那么,为什么地狱? 暂且不谈(请)使用声明是否比try-finally更好的论点,我将try-finally块写成: Simple simp = new Simple(); try { Console.WriteLine(“here”); } finally { simp.Dispose(); simp = null; // sanity-check in case I touch simp again […]

C#using语句

我真的想把这个弄出来。 请看下面的代码: using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, “SELECT * FROM MyDBTable”)) { List resultsList = new List(); foreach (DataRow dataRow in resultTable.Rows) { resultsList.Add(dataRow[0].ToString()); } return resultsList; } 数据表是否处理? 有人可以解释这是如何转换为try / catch / finally块的吗? MSDN声明如果发生exception,仍会调用Dispose方法但是return语句呢? 或者我应该使用下面的代码: List resultsList = new List(); using (DataTable resultTable = DBUtility.GetSingleDBTableResult(connectionString, “SELECT * FROM MyDBTable”)) { foreach (DataRow dataRow in […]

如何解释await / async同步上下文切换行为

有几件事(但主要的一点)我不明白以下代码的行为。 有人可以帮忙解释一下吗? 它实际上是非常简单的代码 – 只是一个调用异步方法的常规方法。 在异步方法中,我使用using块尝试临时更改SynchronizationContext。 在代码的不同点,我探测当前的SynchronizationContext。 这是我的问题: 当执行到达位置“2.1”时,上下文已变为上下文#2。 好的。 然后,因为我们点击`await`,返回一个Task并执行跳回到位置“1.2”。 为什么那么,在位置1.2,上下文不会“粘”在上下文#2? 也许使用using语句和异步方法会有一些魔力吗? 在2.2位,为什么上下文不是Context#2? 上下文是否应该转入“延续”(“等待”之后的陈述)? 码: public class Test { public void StartHere() { SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); this.logCurrentSyncContext(“1.1”); // Context #1 Task t = f(); this.logCurrentSyncContext(“1.2”); // Context #1, why not Context #2? t.Wait(); this.logCurrentSyncContext(“1.3”); // Context #1 } private async Task f() { using (new […]

返回USING创建的对象

我正在创建一个对象(下面的obj)使用并返回该对象作为函数return的一部分。这会导致在我尝试在另一个函数中使用返回值之前处理像object这样的任何问题吗? using (MyObject obj = new MyObject()) { . . . return obj; }

在处理命令并且直接在命令上定义连接时,连接是否关闭?

我知道很多例子都存在,其中定义了SqlConnection,然后在Using块中定义了SqlCommand: using (var conn = new SqlConnection(connString)) { using (var cmd = new SqlCommand()) { cmd.Connection = conn; //open the connection } } 我的问题:如果我直接在SqlCommand上定义连接,那么在处理命令时连接是否会关闭? using (var cmd = new SqlCommand()) { cmd.Connection = new SqlConnection(connString); //open the connection }

什么是C#“使用”指令?

我在代码示例中看到了这个C#using语句: using StringFormat=System.Drawing.StringFormat; 那是什么意思?