using语句块的几种用法。
1、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 语句块内发生异常的情况下也会释放可释放实例。 在前面的示例中,打开的文件在处理完所有行后关闭。
2、使用 await using 语句来正确使用 IAsyncDisposable 实例:
- await using (var resource = new AsyncDisposableExample())
- {
- // Use the resource
- }
有关使用 IAsyncDisposable 实例的详细信息,请参阅实现 DisposeAsync 方法一文中的使用异步可释放对象部分。
3、还可以使用不需要大括号的 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 声明中进行声明时,局部变量在声明它的作用域末尾释放。 在前面的示例中,会在某个方法的末尾释放对象。
4、可以在一个 using 语句中声明多个相同类型的实例,如以下示例所示:
- using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
- {
- // Process both files
- }
在一个 using 语句中声明多个实例时,它们将按声明的相反顺序释放。
5、using 语句也可以采用以下形式:
- using (expression)
- {
- // ...
- }
其中 expression 会生成可释放实例。 下面的示例演示了这一操作:
- StreamReader reader = File.OpenText(filePath);
-
- using (reader)
- {
- // Process file content
- }
警告
第5种的示例中,当控件离开 using 语句后,可释放实例会在其释放后仍保留在范围内。 如果进一步使用该实例,可能会遇到异常,例如 ObjectDisposedException。 因此,建议在 using 语句中声明可释放变量,或者使用 using 声明进行声明。