C# using

using 的使用

引入命名空间

C# 编程中,命名空间在两个方面被大量使用。 首先,.NET 使用命名空间来组织它的许多类,如下所示:

System.Console.WriteLine("Hello World!");

System 是一个命名空间,Console 是该命名空间中的一个类。 可使用 using 关键字,这样就不必使用完整的名称,如下例所示:

using System;
Console.WriteLine("Hello World!");

引入指定命名空间后我们就可以使用指定命名空间的对象了
命名空间具有以下属性:

  • 它们组织大型代码项目。
  • 通过使用 . 运算符分隔它们。
  • using 指令可免去为每个类指定命名空间的名称。
  • global 命名空间是“根”命名空间:global::System 始终引用 .NET System 命名空间。

给命名空间起个别名

using Project = PC.MyCompany.Project;

如果我们引入的命名空间下有同一个名称的对象,这时,程序会无法识别你想要使用哪个命名空间下的对象,通过此功能可以解决,如下:
使用别名前

using PC.MyCompany.Project; using PC.MyCompany.Project2; namespace ConsoleApp { class Program { static void Main(string[] args) { PC.MyCompany.Project.A a = new PC.MyCompany.Project.A(); PC.MyCompany.Project2.A b = new PC.MyCompany.Project2.A(); } } } namespace PC.MyCompany.Project { public class A { public int Add(int a,int b) { return a + b; } } } namespace PC.MyCompany.Project2 { public class A { public int Add(int a, int b) { return a + b+1; } } }

使用别名后

using Project= PC.MyCompany.Project; using Project2= PC.MyCompany.Project2; namespace ConsoleApp { class Program { static void Main(string[] args) { Project.A a = new Project.A(); Project2.A b = new Project2.A(); } } }

using 语句

using 语句可确保正确使用 IDisposable 实例:

var numbers = new List<int>(); using (StreamReader reader = File.OpenText("numbers.txt")) { string line; while ((line = reader.ReadLine()) is not null) { if (int.TryParse(line, out int number)) { numbers.Add(number); } } }

当控件离开 using 语句块时,将释放获取的 IDisposable 实例。 using 语句可确保即使在 using 语句块内发生异常的情况下也会释放可释放实例。 在前面的示例中,打开的文件在处理完所有行后关闭。

使用 await using 语句来正确使用 IAsyncDisposable 实例:

await using (var resource = new AsyncDisposableExample()) { // Use the resource }

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

static IEnumerable<int> LoadNumbers(string filePath) { using StreamReader reader = File.OpenText(filePath); var numbers = new List<int>(); string line; while ((line = reader.ReadLine()) is not null) { if (int.TryParse(line, out int number)) { numbers.Add(number); } } return numbers; }

using 声明中进行声明时,局部变量在声明它的作用域末尾释放。 在前面的示例中,会在某个方法的末尾释放对象。

using 语句或声明进行声明的变量是只读的。 无法重新分配该变量或将其作为 refout 参数传递。

可以在一个 using 语句中声明多个相同类型的实例,如以下示例所示:

using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt")) { // Process both files }

在一个 using 语句中声明多个实例时,它们将按声明的相反顺序释放

还可以将 using 语句和声明与适用于可释放模式的 ref 结构的实例一起使用。 也就是说,它有一个实例 Dispose 方法,该方法是可访问、无参数的并且具有 void 返回类型。

using 语句也可以采用以下形式:

using (expression) { // ... }

其中 expression 会生成可释放实例。 下面的示例演示了这一操作:

StreamReader reader = File.OpenText(filePath); using (reader) { // Process file content }

在前面的示例中,当控件离开 using 语句后,可释放实例会在其释放后仍保留在范围内。 如果进一步使用该实例,可能会遇到异常,例如 ObjectDisposedException。 因此,建议在 using 语句中声明可释放变量,或者使用 using 声明进行声明。

鲸之声为您拼命加载中...