再次认识using

发布时间 2023-06-29 01:22:20作者: 广州大雄

今天看了同事代码,发现using新的语法糖。顿时来了兴趣,赶紧找文档看看,看看更新了那些东西
image

基础用法确保正确使用可释放对象

    class Program
    {
        static async Task Main()
        {
            /*
             *  我们使用 using 语句创建了一个 MyClass 的实例,并在 using 代码块中使用它。
             *  当程序执行到 using 代码块的结束处时,无论是否发生异常,都会自动调用 MyClass 的 Dispose() 方法进行资源的释放。
             */
            using (MyClass myclass = new MyClass())
            {
                Console.WriteLine("内部");
            }
            Console.WriteLine("外部");
            Console.ReadLine();
        }
    }

    public class MyClass : IDisposable
    {
        public MyClass()
        {
            Console.WriteLine("实例化");
        }

        public void Dispose()
        {
            Console.WriteLine("Dispose");
        }
    }

image

发生异常也会调用 Dispose() 方法进行资源的释放。

image

using 语句中声明多个相同类型的实例

image

还可以使用不需要大括号的 using 声明

在using 声明中进行声明时,局部变量在声明它的作用域末尾释放。
image

异步环境中销毁对象

    class Program
    {
        static async Task Main()
        {
            await using (var myClass = new MyClass())
            {
                // 使用资源
                Console.WriteLine("里面");
                await Task.Delay(2000);
            }
            Console.WriteLine("外面");
            Console.ReadLine();
        }
    }

    public class MyClass : IAsyncDisposable
    {
        public MyClass()
        {
            Console.WriteLine("MyClass-实例化");
        }

        public async ValueTask DisposeAsync()
        {
            // 异步释放资源的逻辑
            await Task.Delay(1000);
            Console.WriteLine("MyClass-DisposeAsync");
        }
    }

image