using deyimleri (C# Başvurusu)
Nesnelerin doğru kullanımını sağlayan uygun bir sözdizimi sağlar IDisposable . C# 8,0 ' den başlayarak, using ifade nesnelerin doğru kullanımını sağlar IAsyncDisposable .
Örnek
Aşağıdaki örnek, ifadesinin nasıl kullanılacağını göstermektedir using .
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
using (var reader = new StringReader(manyLines))
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
C# 8,0 ' den başlayarak, using küme ayraçları gerektirmeyen ifade için aşağıdaki alternatif sözdizimini kullanabilirsiniz:
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
using var reader = new StringReader(manyLines);
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
Açıklamalar
File ve Font yönetilmeyen kaynaklara erişen yönetilen türlerin örnekleridir (Bu durumda dosya tutamaçları ve cihaz bağlamları). Birçok farklı türde yönetilmeyen kaynak ve bunları kapsülleyen sınıf kitaplığı türleri vardır. Bu tür türler IDisposable arabirimini veya IAsyncDisposable arabirimini gerçekleştirmelidir.
Bir nesnenin yaşam süresi IDisposable tek bir yöntemle sınırlı olduğunda, bu örneği bildiriminde belirtmeniz ve oluşturmanız gerekir using . usingİfade, Dispose yöntemi nesnesi üzerinde doğru şekilde çağırır ve (daha önce gösterildiği gibi kullandığınızda), bu da nesnenin kendisinin kapsam dışına geçmesine neden olur ve Dispose çağrılır. Blok içinde using , nesne salt okunurdur ve değiştirilemez ya da yeniden atanamaz. Nesnesi yerine uygularsa, IAsyncDisposable IDisposable using ifade öğesini ve döndürülen öğesini çağırır DisposeAsync awaits ValueTask . Hakkında daha fazla bilgi için IAsyncDisposable bkz. DisposeAsync yöntemi uygulama.
usingBu ifade, Dispose DisposeAsync bloğunda bir özel durum gerçekleşse bile (veya) çağrısı yapılmasını sağlar using . Nesneyi bir blok içine yerleştirerek try ve sonra da Dispose (veya) bir blokta çağırarak aynı sonucu elde edebilirsiniz DisposeAsync finally ; aslında, bu, using deyimin derleyici tarafından çevrilme yöntemi olur. Kod örneği, derleme zamanında aşağıdaki koda genişletilir (nesne için sınırlı kapsam oluşturmak için ek küme ayraçları aklınızda):
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
{
var reader = new StringReader(manyLines);
try
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
finally
{
reader?.Dispose();
}
}
Daha yeni using ifade söz dizimi benzer bir koda dönüştürür. tryBlok, değişkenin bildirildiği yerde açılır. finallyBlok, genellikle bir yöntemin sonunda kapsayan bloğa yakın bir zamanda eklenir.
İfadesiyle ilgili daha fazla bilgi için try - finally bkz. try-finally makalesi.
Aşağıdaki örnekte gösterildiği gibi, bir türün birden çok örneği tek bir bildirimde bildirilebilecek using . varTek bir ifadede birden çok değişken bildirdiğinizde örtük olarak yazılmış değişkenleri () kullanamıyoruz.
string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";
using (StringReader left = new StringReader(numbers),
right = new StringReader(letters))
{
string? item;
do
{
item = left.ReadLine();
Console.Write(item);
Console.Write(" ");
item = right.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
Aşağıdaki örnekte gösterildiği gibi, C# 8 ile sunulan yeni sözdizimini kullanarak aynı türdeki birden çok bildirimi birleştirebilirsiniz:
string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";
using StringReader left = new StringReader(numbers),
right = new StringReader(letters);
string? item;
do
{
item = left.ReadLine();
Console.Write(item);
Console.Write(" ");
item = right.ReadLine();
Console.WriteLine(item);
} while (item != null);
Kaynak nesnesini örnekleyebilirsiniz ve sonra değişkeni using ifadeye geçirebilirsiniz, ancak bu en iyi yöntem değildir. Bu durumda, denetim bloğundan ayrıldıktan sonra using nesne kapsamda kalır, büyük olasılıkla yönetilmeyen kaynaklarına erişemez. Diğer bir deyişle, artık tam olarak başlatılamaz. Nesneyi bloğunun dışında kullanmaya çalışırsanız using , bir özel durumun oluşturulması riskiyle karşılaşırsınız. Bu nedenle, deyimindeki nesnenin örneğini oluşturmak using ve kapsamını bloğa sınırlamak daha iyidir using .
string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";
var reader = new StringReader(manyLines);
using (reader)
{
string? item;
do
{
item = reader.ReadLine();
Console.WriteLine(item);
} while (item != null);
}
// reader is in scope here, but has been disposed
Nesneleri elden atma hakkında daha fazla bilgi için IDisposable bkz. IDisposable uygulayan nesneleri kullanma.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminde using ifadesine bakın. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.