Jon Skeet 在我的SOApiDotNet代码(用于pre-alpha Stack Overflow API的.NET库)上发表评论(通过推特):
@ maximz2005我注意到的一件事就是快速浏览源代码:你没有处理(原文如此)WebResponses.FTW"使用"声明.
他表示我需要将这些Web会话包装在"using"语句中.但是,我有一个问题:我应该包装整个事情,从HttpWebRequest开始,还是应该在"using"语句之外创建WebRequest然后将Response包装在里面?我感觉不同的是,在前者中,两个物体都会被处理掉 - 这是正确的吗?
提前致谢.
我最近停止使用using语句,而是使用我调用的任何.net对象的完整命名空间路径.
例:
using System;
namespace QuizViewer
{
class Class1
{
Console.WriteLine("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在所做的.
namespace QuizViewer
{
class Class1
{
System.Console.WriteLine("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
在你问为什么我这样做之前,我正在使用这种风格,以便我可以准确地看到我的对象来自哪里,并且在使用不同的Timer对象和具有相似名称的其他对象时更容易.
这种编程风格是否有任何性能提升或降低?
我看到在大多数样本中,SqlCommand都是这样使用的
using (SqlConnection con = new SqlConnection(CNN_STRING))
{
using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con))
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道为什么我们使用"使用"声明.但是SqlCommand没有包含Close()方法,所以我们应该在using语句中使用它
C#具有该using语句,特别是对于IDisposable对象.据推测,using语句中指定的任何对象都将拥有某种应该确定性释放的资源.
然而,在我看来,编程中有许多设计具有单一,明确的开始和结束,但缺乏内在的语言支持.该using构造提供了使用代码编辑器的内置特征的机会,至少清楚且自然地突出了这种设计或操作的范围.
我想到的是经常以a BeginXXX()和EndXXX()方法开始的那种操作,尽管有很多不同的风格,例如涉及"开始"和"连接"的异步代码执行.
拿这个天真的例子吧.
webDataOperation.Start();
GetContentFromHardDrive();
webDataOperation.Join();
// Perform operation that requires data from both sources
Run Code Online (Sandbox Code Playgroud)
相反,如果Start方法返回了一个IDisposable.Dispose方法执行连接操作的对象,该怎么办?
using(webDataOperation.Start()) {
GetContentFromHardDrive();
}
// Perform operation that requires data from both sources
Run Code Online (Sandbox Code Playgroud)
或者,更好的是,我特别想到的是:我有一个对象,它具有高度专业化的图形blitting,并且有一个Begin()和End()方法(一个设计也出现在DirectX和XNA中).代替...
using(blitter.BlitOperation()) {
// Do work
}
// Use result
Run Code Online (Sandbox Code Playgroud)
它似乎更自然,更易读,但它是不可取的,因为它使用IDisposable界面和using声明用于非预期的目的?换句话说,这是否与以非直观的方式运算符操作符相同?
如果我有一个像这样的使用块的方法...
public IEnumerable<Person> GetPersons()
{
using (var context = new linqAssignmentsDataContext())
{
return context.Persons.Where(p => p.LastName.Contans("dahl"));
}
}
Run Code Online (Sandbox Code Playgroud)
...从using块中返回值,IDisposable对象是否仍然处理?
如何设置ReSharper在课堂上调用"排序使用"?
有没有办法using在C#中扩展块,以便将委托作为第二个参数与IDisposable对象一起使用,并在每次在该using块内抛出异常时执行?
想象一下,我们有一个代表,如下所示:
public delegate void ExceptionHandler(Exception ex);
Run Code Online (Sandbox Code Playgroud)
假设我有一个匹配该委托的方法,如下所示:
public void Log(Exception ex)
{
// Some logging stuff goes here
}
Run Code Online (Sandbox Code Playgroud)
我想完成这样的事情:
using(SqlConnection connection = new SqlConnection(""), Log)
{
}
Run Code Online (Sandbox Code Playgroud)
有没有办法以这种方式扩展C#?
假设我有以下代码:
private void UpdateDB(QuoteDataSet dataSet, Strint tableName)
{
using(SQLiteConnection conn = new SQLiteConnection(_connectionString))
{
conn.Open();
using (SQLiteTransaction transaction = conn.BeginTransaction())
{
using (SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM " + tableName, conn))
{
using (SQLiteDataAdapter sqliteAdapter = new SQLiteDataAdapter())
{
sqliteAdapter.Update(dataSet, tableName);
}
}
transaction.Commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
C#文档声明,通过using语句,范围内的对象将被处理,并且我已经看到了几个建议我们不需要使用try/finally子句的地方.
我通常用try/finally包围我的连接,并且我总是关闭finally子句中的连接.鉴于上述代码,如果存在异常,假设连接将被关闭是否合理?
我在我的VS上安装了ReSharper v9.0.我也使用StyleCop.我已禁用SA1200,因此当我将using语句放在命名空间之外时,我不会再次收到警告.但是当我通过[alt] + [enter]添加引用时,它在using语句中不可用,R#将它放在命名空间中.当然,它不一致,R#应该将它放在命名空间之外.我试图将R#设置重置为出厂默认设置,它按预期工作.但是当我再次应用StyleCop规则时,这个问题又发生了.我该如何设置?
我想知道是否有某种小抄对哪些对象与using语句...顺利SQLConnection,MemoryStream等等.
更进一步,甚至可以显示其他"拼图",就像你应该connection.Close()在结束前使用语句括号实际调用一样.
这样的事情存在吗?如果没有,也许我们应该制作一个.
using-statement ×10
c# ×8
.net ×2
idisposable ×2
namespaces ×2
resharper ×2
using ×2
asp.net ×1
code-cleanup ×1
dispose ×1
exception ×1
sqlcommand ×1
stylecop ×1