using instrukcja — zapewnienie prawidłowego użycia obiektów jednorazowych
Instrukcja using
zapewnia prawidłowe użycie IDisposable wystąpienia:
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);
}
}
}
Gdy kontrolka opuszcza blok instrukcji using
, pozyskane IDisposable wystąpienie zostanie usunięte. W szczególności instrukcja gwarantuje, using
że wystąpienie jednorazowe zostanie usunięte, nawet jeśli wystąpi wyjątek w bloku instrukcji using
. W poprzednim przykładzie otwarty plik jest zamykany po przetworzeniu wszystkich wierszy.
Użyj instrukcji , await using
aby poprawnie użyć IAsyncDisposable wystąpienia:
await using (var resource = new AsyncDisposableExample())
{
// Use the resource
}
Aby uzyskać więcej informacji na temat korzystania z IAsyncDisposable wystąpień, zobacz sekcję Using async unieszkodliwiania artykułu Implement a DisposeAsync method (Implementowanie metody DisposeAsync).
Można również użyć using
deklaracji , która nie wymaga nawiasów klamrowych:
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;
}
Po zadeklarowaniu using
w deklaracji zmienna lokalna jest usuwana na końcu zakresu, w którym jest zadeklarowana. W poprzednim przykładzie usuwanie odbywa się na końcu metody.
Zmienna zadeklarowana przez instrukcję lub deklarację using
jest tylko do odczytu. Nie można ponownie przypisać go ani przekazać go jako parametru ref
lub out
.
Można zadeklarować kilka wystąpień tego samego typu w jednej using
instrukcji, jak pokazano w poniższym przykładzie:
using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
// Process both files
}
Po zadeklarowaniu kilku wystąpień w jednej using
instrukcji są one usuwane w odwrotnej kolejności deklaracji.
Można również użyć instrukcji using
i deklaracji z wystąpieniem struktury ref, która pasuje do wzorca jednorazowego. Oznacza to, że ma metodę wystąpienia Dispose
, która jest dostępna, bez parametrów i ma typ zwracany void
.
Instrukcja using
może być również następująca:
using (expression)
{
// ...
}
w przypadku wystąpienia expression
jednorazowego. W poniższym przykładzie pokazano, że:
StreamReader reader = File.OpenText(filePath);
using (reader)
{
// Process file content
}
Ostrzeżenie
W poprzednim przykładzie po opuszczeniu instrukcji kontrolka using
wystąpienie jednorazowe pozostaje w zakresie, gdy jest już usuwane. Jeśli używasz tego wystąpienia dalej, może wystąpić wyjątek, na przykład ObjectDisposedException. Dlatego zalecamy zadeklarowanie zmiennej jednorazowej using
w instrukcji lub deklaracji using
.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję using statement specyfikacji języka C# i propozycję dotyczącą "opartych na wzorcu using" i "using deklaracji".