第一个问题: 说我有 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string storedProc = "GetData"; SqlCommand command = new SqlCommand(storedProc, connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID)); return (byte[])command.ExecuteScalar(); } 连接是否closures? 因为从技术上讲,我们从来没有return最后,因为我们之前return了。 第二个问题: 这次我有: try { using (SqlConnection connection = new SqlConnection(connectionString)) { int employeeID = findEmployeeID(); connection.Open(); SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection); command.CommandType = […]
我正在做一个项目,并且必须比较两个文件,看看他们是否相互激动。 我的第一个草案之前,错误检查和validation了很多: DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "\\TestArea\\"); FileInfo[] files = di.GetFiles(filename + ".*"); FileInfo outputFile = files.Where(f => f.Extension == ".out").Single<FileInfo>(); FileInfo expectedFile = files.Where(f => f.Extension == ".exp").Single <FileInfo>(); using (StreamReader outFile = new StreamReader(outputFile.OpenRead())) { using (StreamReader expFile = new StreamReader(expectedFile.OpenRead())) { while (!(outFile.EndOfStream || expFile.EndOfStream)) { if (outFile.ReadLine() != expFile.ReadLine()) […]
DataSet和DataTable都实现了IDisposable,所以,通过传统的最佳实践,我应该调用他们的Dispose()方法。 然而,从我目前阅读的内容来看,DataSet和DataTable实际上并没有任何非托pipe资源,所以Dispose()实际上并没有太多的function。 另外,我不能只使用using(DataSet myDataSet…)因为DataSet有一个DataTables的集合。 所以,为了安全起见,我需要遍历myDataSet.Tables,处理每个DataTable,然后处理DataSet。 那么,在我所有的DataSets和DataTables上调用Dispose()是否值得麻烦? 附录: 对于那些认为DataSet应该被处置的人来说:一般来说,处置模式是使用using或try..finally ,因为你要保证Dispose()将被调用。 然而,这对于一个集合来说真的很难实现。 例如,如果对Dispose()的调用之一抛出exception,你会怎么做? 你是否吞下它(这是“坏”),以便继续处理下一个元素? 或者,你是否build议我只是调用myDataSet.Dispose(),而忘记在myDataSet.Tables中configurationDataTables?
用户kokos通过提及using关键字回答了C#问题的精彩隐藏特性 。 你能详细说一下吗? 什么是使用的好用途?
我喜欢在using块中实例化我的WCF服务客户端,因为它几乎是使用实现IDisposable资源的标准方式: using (var client = new SomeWCFServiceClient()) { //Do something with the client } 但是,正如在这篇MSDN文章中指出的那样,将WCF客户端封装在using块中可能会掩盖导致客户端处于故障状态(如超时或通信问题)的任何错误。 长话短说,在调用Dispose()时,客户端的Close()方法会触发,但会因为处于故障状态而引发错误。 原来的exception然后被第二个exception所掩盖。 不好。 MSDN文章中build议的解决方法是完全避免使用using块,而是实例化客户端并使用它们: try { … client.Close(); } catch (CommunicationException e) { … client.Abort(); } catch (TimeoutException e) { … client.Abort(); } catch (Exception e) { … client.Abort(); throw; } 相比于using块,我认为这是丑陋的。 每当你需要一个客户端时,需要写很多代码。 幸运的是,我发现了一些其他的解决方法,比如IServiceOriented上的这个。 你从以下开始: public delegate void UseServiceDelegate<T>(T proxy); […]
System.Net.Http.HttpClient和System.Net.Http.HttpClientHandler在.NET Framework 4.5中实现IDisposable(通过System.Net.Http.HttpMessageInvoker )。 using说明文件说: 通常,在使用IDisposable对象时,应该在using语句中声明并实例化它。 这个答案使用这种模式: var baseAddress = new Uri("http://example.com"); var cookieContainer = new CookieContainer(); using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) { var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("foo", "bar"), new KeyValuePair<string, string>("baz", "bazinga"), }); […]