C#中"使用"的用途是什么
用户kokos通过提及using
关键字,回答了Cquestion的精彩"隐藏功能"。我们能详细说明一下吗? "使用"的用途是什么?
解决方案
回答
使用ADO.NET时,我们可以将键盘用于连接对象或者读取器对象之类的事情。这样,当代码块完成时,它将自动处理连接。
回答
这样的事情:
using (var conn = new SqlConnection("connection string")) { conn.Open(); // Execute SQL statement here on the connection you created }
该SqlConnection将被关闭,而无需显式调用.Close()函数,即使抛出异常,也将发生这种情况,而无需try / catch / finally。
回答
Rhino Mocks记录播放语法对using
进行了有趣的使用。
回答
感谢下面的评论,我将对此帖子进行一些整理(在此,我不应该使用"垃圾收集"一词道歉):
使用using时,它将在using范围的结尾处在对象上调用Dispose()方法。因此,Dispose()方法中可以包含很多很棒的清理代码。
这里有一个要点:要点,如果我们已经对此进行了Dispose()d,至少将浪费资源。
回答
using可用于调用IDisposable。它也可以用于别名类型。
using (SqlConnection cnn = new SqlConnection()) { /*code*/} using f1 = System.Windows.Forms.Form;
回答
"使用"还可以用于解决名称空间冲突。请参阅http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts/,以获取我撰写的有关该主题的简短教程。
回答
using关键字定义对象的作用域,然后在作用域完成后处置该对象。例如。
using (Font font2 = new Font("Arial", 10.0f)) { // use font2 }
有关Cusing关键字的MSDN文章,请参见此处。
回答
当我们拥有要在使用后处置的资源时,将使用using。
例如,如果我们分配文件资源,而只需要在代码的一个部分中使用它来进行一点读写,则使用有助于在完成后立即处置文件资源。
使用的资源需要实现IDisposable才能正常工作。
例子:
using (File file = new File (parameters)) { *code to do stuff with the file* }
回答
使用using语句的原因是为了确保对象在超出范围后立即被处置,并且不需要显式代码来确保这种情况发生。
与理解C#中的" using"语句一样,.NET CLR进行转换
using (MyResource myRes = new MyResource()) { myRes.DoSomething(); }
到
{ // Limits scope of myRes MyResource myRes= new MyResource(); try { myRes.DoSomething(); } finally { // Check for a null resource. if (myRes != null) // Call the object's Dispose method. ((IDisposable)myRes).Dispose(); } }
回答
有趣的是,我们还可以将using / IDisposable模式用于其他有趣的事情(例如Rhino Mocks使用它的另一点)。基本上,我们可以利用编译器将始终在" used"对象上调用.Dispose的事实。如果我们需要在某个操作之后发生某些事情……具有确定的开始和结束的事情……那么我们可以简单地创建一个IDisposable类,该类在构造函数中启动操作,然后在Dispose方法中完成。
这使我们可以使用非常好的using语法来表示所述操作的显式开始和结束。这也是System.Transactions东西的工作方式。
回答
过去,我已经使用很多它来处理输入和输出流。我们可以很好地嵌套它们,从而消除了通常遇到的许多潜在问题(通过自动调用dispose)。例如:
using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open)) { using (BufferedStream bs = new BufferedStream(fs)) { using (System.IO.StreamReader sr = new StreamReader(bs)) { string output = sr.ReadToEnd(); } } }
回答
并不是说它非常重要,但是使用还可用于即时更改资源。是的,如前所述,是一次性的,但是也许我们在执行的其余部分中不希望它们与其他资源不匹配。因此,我们希望对其进行处理,以免在其他地方造成干扰。
回答
由于仍有很多人这样做:
using (System.IO.StreamReader r = new System.IO.StreamReader("")) using (System.IO.StreamReader r2 = new System.IO.StreamReader("")) { //code }
我想很多人仍然不知道我们可以做到:
using (System.IO.StreamReader r = new System.IO.StreamReader(""), r2 = new System.IO.StreamReader("")) { //code }
回答
总之,当我们使用实现" IDisposable"类型的局部变量时,始终无一例外地使用" using" 1.
如果我们使用非本地IDisposable变量,则始终实现IDisposable模式。
两个简单的规则,也不例外1. 否则,防止资源泄漏是* ss的真正痛苦。
1):唯一的例外是-当我们处理例外时。这样,在finally块中显式调用Dispose的代码可能会更少。
回答
将对象立即丢弃的合理使用的另一个示例:
using (IDataReader myReader = DataFunctions.ExecuteReader(CommandType.Text, sql.ToString(), dp.Parameters, myConnectionString)) { while (myReader.Read()) { MyObject theObject = new MyObject(); theObject.PublicProperty = myReader.GetString(0); myCollection.Add(theObject); } }
回答
使用的另一个重要用途是在实例化模式对话框时。
Using frm as new Form1 Form1.ShowDialog ' do stuff here End Using
回答
在某种意义上使用
using (var foo = new Bar()) { Baz(); }
实际上是try / finally块的简写。它等效于代码:
var foo = new Bar(); try { Baz(); } finally { foo.Dispose(); }
我们当然会注意到,第一个代码段比第二个代码段要简洁得多,而且即使抛出异常,我们也可能想做许多事情来进行清理。因此,我们提出了一个称为Scope的类,该类使我们可以在Dispose方法中执行任意代码。因此,例如,如果我们有一个名为IsWorking的属性,在尝试执行某个操作后始终希望将其设置为false,则可以这样做:
using (new Scope(() => IsWorking = false)) { IsWorking = true; MundaneYetDangerousWork(); }
我们可以在此处阅读有关我们的解决方案以及如何派生更多信息的信息。
回答
大括号外的所有内容都已处理完毕,因此如果不使用它们,最好将其处理掉。之所以这样,是因为如果我们有一个SqlDataAdapter对象,并且在应用程序生命周期中仅使用了一次,并且仅填充了一个数据集,而不再需要它,则可以使用以下代码:
using(SqlDataAdapter adapter_object = new SqlDataAdapter(sql_command_parameter)) { // do stuff } // here adapter_object is disposed automatically