谈C# using的用法与好处_C#教程

之前的一篇文章中的代码中有一个using的用法,刚开始查看了一些资料说是强制关闭对象的一个命令。今天又查了一些资料,才明白,原来using指令调用了一个方法——Dispose()方法。而Dispose()方法的作用就是释放所有的使用资源。

例:

public void ExecuteCommand( string connString, string commandString )
{
 SqlConnection myConnection = new SqlConnection( connString );
 SqlCommand mySqlCommand = new SqlCommand( commandString,
  myConnection ); 

 myConnection.Open();
 mySqlCommand.ExecuteNonQuery();
} 

这个例子中的两个可处理对象没有被恰当的释放:SqlConnection和SqlCommand。两个对象同时保存在内存里直到析构函数被调用。

解决这个问题的方法就是在使用完命令和链接后就调用它们的Dispose:

public void ExecuteCommand( string connString, string commandString )
{
 SqlConnection myConnection = new SqlConnection( connString );
 SqlCommand mySqlCommand = new SqlCommand( commandString,
  myConnection ); 

 myConnection.Open();
 mySqlCommand.ExecuteNonQuery(); 

 mySqlCommand.Dispose( );
 myConnection.Dispose( );
} 

使用using语句也可以很好的实现此功能,而且代码很清晰:

public void ExecuteCommand( string connString, string commandString )
{
 using ( SqlConnection myConnection = new  SqlConnection( connString ))
 {
  using ( SqlCommand mySqlCommand = new SqlCommand( commandString, myConnection ))
  {
   myConnection.Open();
   mySqlCommand.ExecuteNonQuery();
  }
 }
} 

当你在一个函数内使用一个可处理对象时,using语句是最简单的方法来保证这个对象被恰当的处理掉。当这些对象被分配时,会被编译器放到一个try/finally块中。

SqlConnection myConnection = null; 

// Example Using clause:
using ( myConnection = new SqlConnection( connString ))
{
 myConnection.Open();
} 

// example Try / Catch block:
try {
 myConnection = new SqlConnection( connString );
 myConnection.Open();
}
finally {
 myConnection.Dispose( );
} 

有时候使用try/finally块的时候会发现如果发生错误,程序不会报错。本人感觉还是使用using语句比较好。
以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
using
cnblue成员谈郑容和、晓松奇谈、裸条放贷者谈肉偿、王思聪谈接班万达、王健林谈接班人,以便于您获取更多的相关知识。

时间: 2024-09-20 15:37:48

谈C# using的用法与好处_C#教程的相关文章

C#中split用法实例总结_C#教程

本文实例总结了C#中split用法.分享给大家供大家参考,具体如下: 以下是我转载的两个不同的人的,方便大家及自己查阅 string s="abcdeabcdeabcde"; string[] sArray=s.Split("c"); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出结果: ab deab deab de string s="abcdeabcdeabcde str

C#中实现线程同步lock关键字的用法详解_C#教程

1. lock关键字保证一个代码块在执行的过程中不会受到其他线程的干扰,这是通过在该代码块的运行过程中对特定的对象加互斥锁来实现的. 2. lock关键字的参数必须是引用类型的对象.lock对基本数据类型如int,long等无效,因为它所作用的类型必须是对象.如果传入long类型数据,势必被转换为Int64结构类型,则加锁的是全新的对象引用.如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的. 3. lock(th

C#学习笔记- 随机函数Random()的用法详解_C#教程

Random.Next() 返回非负随机数: Random.Next(Int) 返回一个小于所指定最大值的非负随机数 Random.Next(Int,Int) 返回一个指定范围内的随机数,例如(-100,0)返回负数 1.random(number)函数介绍 见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表一个整数. 示例: trace(random(5)); 2.Math.random() 见帮助文档.返回一个有14位精度的

C# List 排序各种用法与比较_C#教程

下面介绍各种List的sort的用法与比较 首先,我们建一个People的实体,有name.age.sex的属性,我们要排序的字段是年龄age 新建一个实体类 public class People { public string name { get; set; } public int age { get; set; } public string sex { get; set; } } 新建list的数据     List<People> peoples = new List<Pe

C#中abstract的用法详解_C#教程

abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常. 如: using System; namespace ConsoleApplication8 { class Program { static void Main(string[] args) { BClass b = new BClass(); b.m1(); } }

C#中const 和 readonly 修饰符的用法详解_C#教程

1. 只有C#内置类型(int,double,long等)可以声明为const;结果.类和数组不能声明为const. 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问. 3. const 必须在申明中初始化.之后不能再修改. 4. readonly可以在申明中初始化,也可以在构造函数中初始化,其它情况不能修改. namespace const_and_readonly { class Program { static void Main(string[] args) { Co

C#信号量用法简单示例_C#教程

本文实例讲述了C#信号量用法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; /* * 标题:如何使用信号量的示例代码 * Author:kagula * Date:2015-6-16 * Environment:VS2010SP1, .NET Framework 4 client profi

C#学习笔记- 浅谈数组复制,排序,取段,元组_C#教程

C#学习笔记- 浅谈数组复制,排序,取段,元组 using System; using System.Collections.Generic; namespace Application { class Test { static void Main () { //元组类型Tuple是静态类型,用静态方法创建实例,超过8个元素则第8个元素是元组类型 var tupe = Tuple.Create<int,int,string,string> (1, 2, "a", &quo

关于finalize机制和引用、引用队列的用法详解_C#教程

C++有析构函数这个东西,能够很好地在对象销毁前做一些释放外部资源的工作,但是java没有.Object.finalize()提供了与析构函数类似的机制,但是它不安全.会导致严重的内存消耗和性能降低,应该避免使用.best practice是:像java类库的IO流.数据库连接.socket一样,提供显示的资源释放接口,程序员使用完这些资源后,必须要显示释放.所以可以忘记Object.finalize()的存在.JVM启动的时候,会创建一个Finalizer线程来支持finalize方法的执行.