C#里using的妙用(释放资源)

       其实关于using的作用,我想大家最多的用在引入命名空间。其实我在这之前也跟大家一样,不过今天在看一个小例子后,则让我产生了疑问。好拉,我先把代码附上吧。

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        try 
        {
            // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (StreamReader sr = new StreamReader("TestFile.txt")) 
            {
                string line;
                // Read and display lines from the file until the end of 
                // the file is reached.
                while ((line = sr.ReadLine()) != null) 
                {
                    Console.WriteLine(line);
                }
            }
        }
        catch (Exception e) 
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}

不知道上面的程序有没有一处让你比较困惑的呢,好拉,我就不卖关子了,我不懂的那一处如下:


using (StreamReader sr = new StreamReader("TestFile.txt"))

{

       .....................


        一开始我以为是引入命名空间什么的,不过带着怀疑的态度,我到Q群里提出我自己的疑问。好在在他们的帮助下,让我纠正了我之前的错误想法。其实我们在连接数据库的时候也经常会使用到using的语法,类似下面这句:


using (SqlConnection conn = new SqlConnection(source))
{
       //code
}


千万不要以为任何地方的实例化都可以这样使用在using块里的哦,一般是在需要自动释放资源的地方才会用到。其实说需要自动释放资源,可能大家也不是很理解。这样说吧,你想要能这样使用using块的话,你需要保证满足下面一点:


(1)此类实现了接口IDisposable(这个接口只有一个方法void Dispose()),当这个类在using中实例化的时候,using代码块结束时会自动调用这个类中实现了接口IDisposable的Dispose()方法。Dispose()方法中常用来做些释放资源的动作


看看下面的一个简单的例子:


using System;

class Program
{
    public static void Main(string[] args)
    {
        using (Test test = new Test())
        {
            Console.WriteLine("Disposable is open!");
        }

        Console.WriteLine("Disposable is none!");
        Console.ReadKey();
    }
}

public class Test:IDisposable
{

    #region IDisposable 成员

    public void Dispose()
    {
        Console.WriteLine("Disposable is close!");
    }

    #endregion
}

这里输出的结果是:

Disposable is open!
Disposable is close!
Disposable is none!

好拉,今天的执笔就到此为止,谢谢大家!


注:ADO.net 中的连接等操作都实现了IDisposable接口,可以使用using进行资源管理!

 using (SqlConnection conn = new SqlConnection(@"Data Source=(localDB)\V11.0;
        AttachDbFilename=E:\HUST-CODE\ADO_NETPra\ADO_NETPra\Database1.mdf;Integrated Security=True"))
            {
                conn.Open();
                using (SqlCommand cmd=conn.CreateCommand())
                {
                    cmd.CommandText ="insert into Book(Name) values('charles')";
                    cmd.ExecuteNonQuery();
                    Console.WriteLine("执行成功!");
                }
            }



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中,使用 Task 来执行异步操作是很常见的。当使用 Task 完成操作后,需要释放相关资源以确保代码的正确性和效率。 以下是一些释放资源的常见方法: 1. 使用 using 语句块:使用 using 语句块可以确保在完成操作后释放资源。例如,如果你在 Task 中使用了某个资源,可以将其包装在 using 语句块中,这样在 Task 完成后会自动释放资源。 ```csharp Task.Run(() => { // 使用某个资源 using (var resource = new SomeResource()) { // 执行异步操作 } }); ``` 2. 手动释放资源:如果无法使用 using 语句块,你也可以手动释放资源。在 Task 完成后,确保调用相关资源的 Dispose 方法来释放资源。 ```csharp Task.Run(() => { var resource = new SomeResource(); try { // 执行异步操作 } finally { // 释放资源 resource.Dispose(); } }); ``` 3. 使用 CancellationTokenSource:如果你需要取消 Task 的执行并释放相关资源,可以使用 CancellationTokenSource。在 Task 执行过程中,可以检查 CancellationToken 的状态,并根据需要进行取消和资源释放。 ```csharp var cts = new CancellationTokenSource(); var token = cts.Token; Task.Run(() => { // 执行异步操作 // 检查 CancellationToken 的状态并进行相应操作 if (token.IsCancellationRequested) { // 取消操作并释放资源 // ... } }); ``` 以上是一些常见的方法来释放资源,具体的实现方式会根据你的具体需求和代码结构而有所不同。记得始终确保在 Task 完成后释放资源,以避免潜在的问题和资源泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值