Aracılığıyla paylaş


Komutlar using ve bildirimler using ile ilgili uyarıları çözün.

Bu makale aşağıdaki derleyici hatalarını kapsar:

  • CS0245: Yok ediciler ve object.Finalize doğrudan çağrılamaz. Varsa IDisposable.Dispose'ü çağırmayı düşünün.
  • CS0728: Bir using veya lock deyiminin bağımsız değişkeni olan yerel değişkene yanlış atama olabilir. Çağrı Dispose veya kilidi açma, yerel değerin özgün değerinde gerçekleşir.
  • CS1674: Using deyiminde kullanılan tür örtük olarak 'System.IDisposable' olarak dönüştürülebilir olmalıdır.
  • CS8410: 'Zaman uyumsuz using bir deyimde kullanılan tür örtük olarak 'System.IAsyncDisposable' olarak dönüştürülebilir olmalı veya uygun bir 'DisposeAsync' yöntemi uygulanmalıdır.
  • CS8417: Zaman uyumsuz using deyiminde kullanılan türün 'System.IAsyncDisposable' veya uygun bir 'DisposeAsync' yöntemi uygulaması gerekir. 'using' yerine 'await using' demek mi istediniz?
  • CS8418: Using deyiminde kullanılan tür 'System.IDisposable' uygulamalıdır. 'Kullanmak' yerine 'await using' mi demek istedin?
  • CS8647: Bir using değişkeni doğrudan bir switch ifadesi bölgesi içinde kullanılamaz (köşeli parantez kullanmayı göz önünde bulundurun).
  • CS8648: A goto , bir using bildiriminin ardından bir konuma atlayamaz.
  • CS8649: A goto , aynı blok içindeki bir using bildiriminden önce bir konuma atlayamaz.
  • CS9229: Bildirim kullanılarak değiştiriciler yerleştirilemez.

IDisposable ve IAsyncDisposable Özelliklerini Gerçekleştirme

Aşağıdaki derleyici hataları ve uyarıları dispose desenini uygulama veya kullanma ile ilgili sorunları gösterir:

  • CS0245: Yıkıcı yöntemler ve object.Finalize doğrudan çağrılamaz. Varsa, IDisposable.Dispose çağırmayı düşünün.
  • CS1674: Using deyiminde kullanılan tür örtük olarak 'System.IDisposable' olarak dönüştürülebilir olmalıdır.
  • CS8410: Zaman uyumsuz using ifadesinde kullanılan tür 'System.IAsyncDisposable' biçimine dönüştürülebilmeli veya uygun bir 'DisposeAsync' yöntemi olmalıdır.
  • CS8417: Eşzamansız using bir deyimde kullanılan tür, 'System.IAsyncDisposable' veya uygun bir 'DisposeAsync' yöntemini uygulamalıdır. 'await using' yerine 'using' demek istediniz mi?
  • CS8418: Using deyiminde kullanılan türün 'System.IDisposable' uygulaması gerekir. 'using' yerine 'await using' demek mi istedin?

using deyimi, using bloğunun sonunda kaynakların düzgün bir şekilde atılmasını sağlar. using deyimiyle bir türü kullanmak için uygun bertaraf arabirimini uygulaması gerekir. Zaman uyumlu using deyimler için tür IDisposable uygulamalıdır. Asenkron await using deyimler için tür, IAsyncDisposable uygulaması gerekir.

  • Finalize doğrudan çağrılamıyor (CS0245): Bir yıkıcıyı veya Object.Finalize yöntemi doğrudan çağıramazsınız. Nesnelere artık başvurulmadığında çöp toplayıcı otomatik olarak sonlandırıcıları çağırır. Deterministik temizleme için bunun yerine IDisposable 'i uygulayın ve Dispose metodunu çağırın.
  • Tür IDisposable (CS1674) uygulamalıdır: Yalnızca IDisposable arabirimini uygulayan türler bir using deyiminde kullanılabilir. Değer türleri bu arabirimi uygulamaz ve uygun kısıtlamaları olmayan genel tür parametrelerinin atılabilir olduğu varsayılamaz. Genel türlerle çalışırken olduğu gibi where T : IDisposable bir tür kısıtlaması uygulayın.
  • Tür IAsyncDisposable (CS8410) uygulamalıdır: await using ile kullanılan türler, IAsyncDisposable uygulamalı veya uygun bir DisposeAsync yöntem sağlamalıdır. Türünüz asenkron elden çıkarmayı desteklemiyorsa, bunun yerine senkron using bir deyim kullanın veya gerekli arabirimi uygulayın.
  • Eşleşmeyen elden çıkarma düzeni (CS8417, CS8418): CS8417, yalnızca IDisposable uygulayan bir türle await using kullandığınızda oluşur. CS8418, yalnızca IAsyncDisposable uygulayan bir türle zaman uyumlu using kullandığınızda oluşur. using Anahtar sözcüğünü türünüzün uyguladığı arabirimle eşleştirin veya her iki deseni de desteklemeniz gerekiyorsa her iki arabirimi de uygulayın.

Daha fazla bilgi için bkz Sonlandırıcılar, Dispose yöntemi uygulayın ve DisposeAsync yöntemi uygulayın.

Değişken kapsamı ve denetim akışını kullanma

Aşağıdaki derleyici hataları ve uyarıları, denetim akışı deyimleri içindeki değişkenlerin yanlış kullanımıyla using ilgilidir:

  • CS0728: Yerel değişken, bir using veya lock ifadesi argümanı olarak, yanlış atamaya yol açabilir. Çağrı Dispose veya kilidi açma, yerelin özgün değeri üzerinde olur.
  • CS8647: Bir using değişkeni doğrudan bir switch bloğu içinde kullanılamaz (parantez kullanmayı göz önünde bulundurun).
  • CS8648: A goto , bir using bildiriminin ardından bir konuma atlayamaz.
  • CS8649: A goto , aynı blok içindeki bir using bildiriminden önce bir konuma atlayamaz.

ile using bildirilen değişkenlerin kaynak sızıntılarını önleyen belirli kapsam kuralları vardır. Derleyici, uygun şekilde elden çıkarılmasını sağlamak için bu kuralları zorlar.

  • Değişkeni kullanmaya atama (CS0728): Bu uyarı, bir deyimdeki kaynak olan değişkene yeni bir using değer atadığınız anlamına gelir. Dispose çağrısı, yeni atanan değerde değil özgün değerde gerçekleşir ve bu da kaynak sızıntılarına neden olabilir. Kaynağı daha sonra atamak yerine, using deyimi bildiriminde başlatın.

  • Switch bölümünde değişken kullanma (CS8647): using bildirim, kapsamının sonunda atılan bir değişken oluşturur. Anahtar bölümünde küme ayraçları olmadan doğrudan kullanıldığında kapsam belirsizdir ve hatalara yol açabilir. Kapsamı net bir şekilde tanımlamak için bölüm içeriğini küme ayraçları içine alın.

  • Goto deyimleri ve kullanım bildirimleri (CS8648, CS8649): Bildirimlerin üstünden atlamak için goto deyimlerini kullanamazsınız çünkü bu, doğru kaynak yönetimini atlamanıza neden olurusing. CS8648, bir using bildirimin üzerinden ileriye doğru atlarken oluşur ve CS8649, bildirimden önceki using bir konuma geri atlarken oluşur. Kodunuzu döngüler gibi yapılandırılmış kontrol akışını kullanacak şekilde yeniden yapılandırın veya using bildirimi atlama hedefinin dışına taşıyın.

Daha fazla bilgi için bkz. using deyimi.

Yanlış using bildirim

  • CS9229: Bildirim kullanılarak değiştiriciler yerleştirilemez.

using bildiriminde sarmalanan bir değişken bildirimi, aşağıdaki değiştiricilerden hiçbirini içeremez:

  • const
  • static
  • volatile
  • readonly
  • Erişilebilirlik değiştiricileri: public, protected, internal, private, , protected internalveya private protected

Aşağıdaki örnek CS9229 oluşturur:

using System;

class Program
{
    static void Main()
    {
        // error CS9229: Modifiers cannot be placed on using declarations.
        public using var resource = new Resource();

        // error CS9229: Modifiers cannot be placed on using declarations.
        static using var anotherResource = new Resource();
    }
}

class Resource : IDisposable
{
    public void Dispose() { }
}

Bu hatayı düzeltmek için değiştiriciyi bildirimden using kaldırın:

using var resource = new Resource();

Daha fazla bilgi için bakınız using deyimi.