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
}
有关使用IAsyncDisposable实例的详细信息,请参阅实现 DisposeAsync 方法文章的 Using async 可释放部分。
还可以使用不需要大括号的 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 声明中进行声明时,局部变量在声明它的作用域末尾释放。 在前面的示例中,会在某个方法的末尾释放对象。
C# 语言参考记录了最近发布的 C# 语言版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。
本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。
小窍门
若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。
由 using 语句或声明进行声明的变量是只读的。 无法重新分配或将其作为 ref 或 out 参数传递。
可以在一个 using 语句中声明多个相同类型的实例,如以下示例所示:
using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
// Process both files
}
在一个 using 语句中声明多个实例时,它们将按声明的相反顺序释放。
还可以将 using 语句和声明与适用于可释放模式的 ref 结构的实例一起使用。 也就是说,它具有可访问、无参数且具有Dispose返回类型的实例void方法。
块内的一个returnusing仍然保证处置。 编译器将其重写为 a try/finally,因此始终在方法返回之前调用资源 Dispose 。
using 语句也可以采用以下形式:
using (expression)
{
// ...
}
其中 expression 会生成可释放实例。 以下示例演示了该窗体:
StreamReader reader = File.OpenText(filePath);
using (reader)
{
// Process file content
}
警告
在前面的示例中,当控件离开 using 语句后,可释放实例会在其释放后仍保留在范围内。 如果进一步使用该实例,可能会遇到异常,例如 ObjectDisposedException。 这就是应在语句中或using声明中using声明可释放变量的原因。
C# 语言规范
有关详细信息,请参阅 C# 语言规范的 using 语句部分。