Aracılığıyla paylaş


C# ön işlemci yönergeleri

Derleyicinin ayrı bir ön işlemcisi olmasa da, bu bölümde açıklanan yönergeleri sanki bir tane varmış gibi işler. Koşullu derlemeye yardımcı olması için bu yönergeleri kullanın. C ve C++ yönergelerinin aksine, makro oluşturmak için bu yönergeleri kullanamazsınız. Bir satırdaki tek yönerge önişlemci yönergesi olmalıdır.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

Dosya tabanlı uygulamalar

Dosya tabanlı uygulamalar, (veya herhangi bir *.cs dosya) kullanarak dotnet run Program.cs derleyip çalıştırdığınız programlardır. C# derleyicisi bu önişlemci yönergelerini yoksayar, ancak derleme sistemi bunları ayrıştırarak çıkışı oluşturur. Bu yönergeler, proje tabanlı derlemede karşılaşıldığında uyarılar oluşturur.

C# derleyicisi, #: veya #! ile başlayan herhangi bir önişlemci yönergesini yoksayar.

#! Önişlemci yönergesi Unix kabuklarının kullanarak dotnet runbir C# dosyasını doğrudan yürütmesini sağlar. Örneğin:

#!/usr/bin/env dotnet run
Console.WriteLine("Hello");

Yukarıdaki kod parçacığı, bir Unix kabuğunu kullanarak dotnet rundosyayı yürütmesi konusunda bilgilendirmektedir. komutu /usr/bin/env PATH'inizde yürütülebilir dosyayı bulur dotnet ve bu yaklaşımı farklı Unix ve macOS dağıtımlarında taşınabilir hale getirir. Satır #! , dosyadaki ilk satır olmalıdır ve aşağıdaki belirteçler çalıştırılacak programdır. Bu özellik için C# dosyasında yürütme (x) iznini etkinleştirmeniz gerekir.

#: Dosya tabanlı uygulamalarda kullanılan yönergeler, dosya tabanlı uygulamalar başvurusunda açıklanmıştır.

Diğer araçlar, kuralı izleyerek #: yeni belirteçler ekleyebilir.

Boş değer atanabilir bağlam

#nullable önişlemci yönergesi ek açıklamalarını ve uyarınull atanabilir bağlamolarak ayarlar. Bu yönerge, null atanabilir ek açıklamaların etkili olup olmadığını ve null atanabilirlik uyarılarının verilip verilmeyeceğini denetler. Her bir bayrak ya devre dışı ya da etkin.

öğesini öğesine PropertyGroup ekleyerek her iki bağlamı da proje düzeyinde (C# kaynak kodunun Nullable dışında) belirtebilirsiniz. #nullable yönergesi, ek açıklama ve uyarı bayraklarını denetler ve proje düzeyindeki ayarların önüne geçer. Yönerge, başka bir yönerge onu geçersiz kılana kadar veya kaynak dosyanın sonuna kadar denetimindeki bayrağı ayarlar.

Yönergelerin etkisi aşağıdaki gibidir:

  • :devre dışı bırakılabilir bağlamı ayarlar.
  • : Null atanabilir bağlamı etkinleştirilmiş olarakayarlar.
  • #nullable restore: İptal edilebilir bağlamı proje ayarlarına eski haline getirir.
  • : Null atanabilir bağlamdaki ek açıklamalar bayrağınıdevre dışı olarak ayarlar.
  • #nullable enable annotations: Null atanabilir bağlamdaki ek açıklamalar bayrağını etkinleştirilmişolarak ayarlar.
  • #nullable restore annotations: Null edilebilir bağlamdaki açıklama bayrağını proje ayarlarına geri yükler.
  • : Null değer atanabilir bağlamdaki uyarı bayrağını devre dışı olarakayarlar.
  • #nullable enable warnings: Null atanabilir bağlamdaki uyarı bayrağını etkinleştirilmişolarak ayarlar.
  • #nullable restore warnings: Null edilebilir bağlamdaki uyarı bayrağını proje ayarlarına geri yükler.

Koşullu derleme

Koşullu derlemeyi denetlemek için dört önişlemci yönergesi kullanın:

  • #if: Koşullu derleme başlatır. Derleyici, kodu yalnızca belirtilen simge tanımlandığında derler.
  • #elif: Önceki koşullu derlemeyi kapatır ve belirtilen simgenin tanımlanıp tanımlanmadığını temel alan yeni bir koşullu derleme açar.
  • #else: Önceki koşullu derlemeyi kapatır ve önceki belirtilen simge tanımlanmamışsa yeni bir koşullu derleme açar.
  • #endif: Önceki koşullu derlemeyi kapatır.

Derleme sistemi, SDK stilindeki projelerde farklı hedef çerçeveleri temsil eden önceden tanımlanmış ön işlemci sembollerinin de farkındadır. Birden fazla .NET sürümünü hedefleyebilecek uygulamalar oluştururken kullanışlıdır.

Hedef Çerçeveler Simgeler Ek simgeler
(.NET 5+ SDK'larda kullanılabilir)
Platform simgeleri (yalnızca kullanılabilir)
işletim sistemine özgü bir TFM belirttiğinizde)
.NET Framework NETFRAMEWORK, NET481, NET48, , NET472, NET471, NET47, , NET462, NET461, NET46, NET452, NET451, NET45NET40NET35,NET20 NET48_OR_GREATER, , NET472_OR_GREATER, , NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, , NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATERNET451_OR_GREATER, NET45_OR_GREATERNET40_OR_GREATER, NET35_OR_GREATERNET20_OR_GREATER
.NET Standard NETSTANDARD, , NETSTANDARD2_1NETSTANDARD2_0, , NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1,NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_6_OR_GREATER, , NETSTANDARD1_5_OR_GREATER, NETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, NETSTANDARD1_1_OR_GREATER, NETSTANDARD1_0_OR_GREATER
.NET 5+ (ve .NET Core) NET, NET10_0, NET9_0, , NET8_0, NET7_0, NET6_0, , NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1,NETCOREAPP1_0 NET10_0_OR_GREATER, , NET9_0_OR_GREATER, , NET8_0_OR_GREATER, NET7_0_OR_GREATER, NET6_0_OR_GREATER, , NET5_0_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATERNETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATERNETCOREAPP2_0_OR_GREATER, NETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER ANDROID, BROWSER, IOS, , MACCATALYST, MACOS, TVOS, WINDOWS,
[OS][version] (örneğin IOS15_1),
[OS][version]_OR_GREATER (örneğin IOS15_1_OR_GREATER)

Not

  • Sürümsüz simgeler, hedeflediğiniz sürümden bağımsız olarak tanımlanır.
  • Sürüme özgü simgeler yalnızca hedeflediğiniz sürüm için tanımlanır.
  • Simgeler <framework>_OR_GREATER , hedeflediğiniz sürüm ve önceki tüm sürümler için tanımlanır. Örneğin, .NET Framework 2.0'ı hedef alıyorsanız, şu simgeler tanımlanır: NET20, NET20_OR_GREATER, NET11_OR_GREATERve NET10_OR_GREATER.
  • Simgeler NETSTANDARD<x>_<y>_OR_GREATER yalnızca .NET Standard hedefleri için tanımlanır, .NET Core ve .NET Framework gibi .NET Standard uygulayan hedefler için tanımlanmaz.
  • Bunlar MSBuild TargetFramework özelliği ve NuGet tarafından kullanılan hedef çerçeve adlarından (TFM' ler) farklıdır.

Not

Geleneksel, SDK stili olmayan projelerde, visual studio'daki farklı hedef çerçeveler için koşullu derleme simgelerini projenin özellikler sayfaları aracılığıyla el ile yapılandırmanız gerekir.

Önceden tanımlanmış diğer simgeler ve DEBUG sabitlerini içerirTRACE. Proje için ayarlanan değerleri geçersiz kılmak için kullanın #define . DEBUG Örneğin simge, derleme yapılandırma özelliklerinize ("Hata Ayıklama" veya "Yayın" modu) bağlı olarak otomatik olarak ayarlanır.

C# derleyicisi, yönergesi ile #if yönergesi #endif arasındaki kodu yalnızca belirtilen simge tanımlandığında veya not işleci kullanıldığında tanımlanmadığında ! derler. C ve C++'ın aksine, bir simgeye sayısal değer atayamazsınız. C# dilindeki #if deyimi Boole değeridir ve yalnızca sembolün tanımlanıp tanımlanmadığını sınar. Örneğin, tanımlandığında DEBUG aşağıdaki kod derlenmiş:

#if DEBUG
    Console.WriteLine("Debug version");
#endif

Aşağıdaki kod tanımlanmadığında MYTEST derlenmiş:

#if !MYTEST
    Console.WriteLine("MYTEST is not defined");
#endif

veya falsedeğerlerini test etmek için bool işleçleri true== (eşitlik) ve != (eşitsizlik) kullanın. true simgenin tanımlandığı anlamına gelir. deyimi #if DEBUG ile aynı anlama sahiptir #if (DEBUG == true). Birden çok simge tanımlanıp tanımlanmadığını && değerlendirmek için (ve), || (veya) ve ! (değil) işleçlerini kullanın. Simgeleri ve işleçleri ayraçlarla da gruplandırabilirsiniz.

Aşağıdaki örnekte kodunuzun geriye dönük uyumlu kalırken daha yeni .NET özelliklerinden yararlanmasını sağlayan karmaşık bir yönerge gösterilmektedir. Örneğin, kodunuzda bir NuGet paketi kullandığınızı, ancak paketin yalnızca .NET 6 ve yukarısını desteklediğini ve .NET Standard 2.0 ve daha yüksek bir sürümü desteklediğini düşünün:

#if (NET6_0_OR_GREATER || NETSTANDARD2_0_OR_GREATER)
    Console.WriteLine("Using .NET 6+ or .NET Standard 2+ code.");
#else
    Console.WriteLine("Using older code that doesn't support the above .NET versions.");
#endif

#if, , , #else, #elif, #endifve #define yönergeleriyle #undefbirlikte, bir veya daha fazla simgenin varlığına bağlı olarak kod eklemenize veya hariç tutmanıza olanak tanır. Koşullu derleme, hata ayıklama derlemesi için kod derlerken veya belirli bir yapılandırma için derleme yaparken yararlı olabilir.

#elif bileşik bir koşullu yönerge oluşturmanıza olanak tanır. Derleyici, yukarıdaki veya #elif önceki #if , isteğe bağlı #elif yönerge ifadeleri olarak değerlendirilmezse ifadeyi truedeğerlendirir. bir #elif ifade olarak değerlendirilirse true, derleyici ile sonraki koşullu yönerge arasındaki #elif tüm kodu değerlendirir. Örneğin:

#define VC7
//...
#if DEBUG
    Console.WriteLine("Debug build");
#elif VC7
    Console.WriteLine("Visual Studio 7");
#endif

#else bileşik bir koşullu yönerge oluşturmanıza olanak tanır. Yukarıdaki #if veya (isteğe bağlı) #elif yönergelerindeki ifadelerden hiçbiri değerini değerlendirmezsetrue, derleyici ile sonraki #endifarasındaki #else tüm kodu değerlendirir. #endif sonraki önişlemci yönergesi #elseolmalıdır.

#endif , yönergesiyle başlayan bir koşullu yönergenin #if sonunu belirtir.

Aşağıdaki örnekte, bir dosyada sembol tanımlama MYTEST ve ardından ve DEBUG simgelerinin MYTEST değerlerini test etme adımları gösterilmektedir. Bu örneğin çıktısı, projeyi Hata Ayıklama veya Sürüm yapılandırma modunda oluşturup oluşturmadığınıza bağlıdır.

#define MYTEST
using System;
public class MyClass
{
    static void Main()
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}

Aşağıdaki örnekte, mümkün olduğunda daha yeni API'leri kullanabilmeniz için farklı hedef çerçeveleri test etme adımları gösterilmektedir:

public class MyClass
{
    static void Main()
    {
#if NET40
        WebClient _client = new WebClient();
#else
        HttpClient _client = new HttpClient();
#endif
    }
    //...
}

Sembolleri tanımlama

Koşullu derleme simgelerini tanımlamak veya tanımlamak için aşağıdaki iki önişlemci yönergesini kullanın:

  • #define: Bir simge tanımlayın.
  • #undef: Bir simgenin tanımlarını kaldırın.

Simge tanımlamak için kullanın #define . #if yönergesine geçirilen ifade olarak sembolünü kullandığınızda, ifade aşağıdaki örnekte gösterildiği gibi trueolarak değerlendirilir:

#define VERBOSE

#if VERBOSE
   Console.WriteLine("Verbose output version");
#endif

Not

C# dilinde temel sabitler anahtar sözcüğü kullanılarak const tanımlanmalıdır. Bildirim const , çalışma zamanında değiştirilmeyecek bir static üye oluşturur. yönergesi #define , genellikle C ve C++'da yapılan sabit değerleri bildirmek için kullanılamaz. Bu tür sabitleriniz varsa, bunları tutmak için ayrı bir "Sabitler" sınıfı oluşturmayı göz önünde bulundurun.

Derleme koşullarını belirtmek için sembolleri kullanın. veya #elifkullanarak #if simgeyi test edin. Koşullu derleme gerçekleştirmek için de ConditionalAttribute kullanabilirsiniz. Simge tanımlayabilirsiniz, ancak simgeye değer atayamazsınız. Önişlemci #define yönergeleri olmayan yönergeleri kullanmadan önce yönergenin dosyada görünmesi gerekir. Ayrıca DefineConstants derleyici seçeneğini kullanarak da bir simge tanımlayabilirsiniz. kullanarak #undefbir simgenin tanımlarını kaldırın.

Bölgeleri tanımlama

Aşağıdaki iki önişlemci yönergesini kullanarak bir ana hat içinde daraltabileceğiniz kod bölgelerini tanımlayın:

  • #region: Bir bölge başlatın.
  • #endregion: Bir bölgeyi sonlandırma.

#region, kod düzenleyicisinin ana hat özelliğini kullanırken genişletebileceğiniz veya daraltabileceğiniz bir kod bloğu belirtmenize olanak tanır. Daha uzun kod dosyalarında, dosyanın üzerinde çalışmakta olduğunuz bölümüne odaklanabilmeniz için bir veya daha fazla bölgeyi daraltmak veya gizlemek kullanışlıdır. Aşağıdaki örnekte bir bölgenin nasıl tanımlanacağı gösterilmektedir:

#region MyClass definition
public class MyClass
{
    static void Main()
    {
    }
}
#endregion

Bir #region bloğun bir #endregion yönergeyle sonlandırılması gerekir. Blok #region , bir #if blokla örtüşemez. Bununla birlikte, bir #region blok bir #if bloğun içine yerleştirilebilir ve bir #if blok da bir #region bloğun içine iç içe yerleştirilebilir.

Hata ve uyarı bilgileri

Kullanıcı tanımlı derleyici hataları ve uyarıları oluşturmak ve satır bilgilerini denetlemek için aşağıdaki yönergeleri kullanabilirsiniz:

  • #error: Belirtilen iletiyle bir derleyici hatası oluşturun.
  • #warning: Belirli bir iletiyle bir derleyici uyarısı oluşturun.
  • #line: Derleyici iletileriyle yazdırılan satır numarasını değiştirin.

Kodunuzda belirli bir konumdan CS1029 kullanıcı tanımlı bir hata oluşturmak için kullanın#error. Örneğin:

#error Deprecated code in this method.

Not

Derleyici özel bir şekilde davranır #error version ve kullanılan derleyici ve dil sürümlerini içeren bir iletiyle cs8304 derleyici hatasını bildirir.

Kodunuzda belirli bir konumdan CS1030 düzeyinde bir derleyici uyarısı oluşturmak için kullanın#warning. Örneğin:

#warning Deprecated code in this method.

Derleyicinin satır numaralandırmasını ve (isteğe bağlı olarak) hata ve uyarılar için dosya adı çıkışını değiştirmek için kullanın #line .

Aşağıdaki örnek, satır numaralarıyla ilişkili iki uyarının nasıl rapor yapılacağını gösterir. yönergesi, #line 200 sonraki satırın numarasını 200 olarak zorlar (varsayılan değer #6 olmasına rağmen) ve sonraki #line yönergeye kadar dosya adı "Özel" olarak bildirilir. yönergesi #line default , satır numaralandırmasını varsayılan numaralandırmasına döndürür ve bu da önceki yönerge tarafından yeniden numaralandırılan satırları sayar.

class MainClass
{
    static void Main()
    {
#line 200 "Special"
        int i;
        int j;
#line default
        char c;
        float f;
#line hidden // numbering not affected
        string s;
        double d;
    }
}

Derleme aşağıdaki çıkışı oluşturur:

Special(200,13): warning CS0168: The variable 'i' is declared but never used
Special(201,13): warning CS0168: The variable 'j' is declared but never used
MainClass.cs(9,14): warning CS0168: The variable 'c' is declared but never used
MainClass.cs(10,15): warning CS0168: The variable 'f' is declared but never used
MainClass.cs(12,16): warning CS0168: The variable 's' is declared but never used
MainClass.cs(13,16): warning CS0168: The variable 'd' is declared but never used

yönergesi #line , derleme işleminde otomatik, ara bir adımda kullanılabilir. Örneğin, özgün kaynak kod dosyasından satırları kaldırırsanız ancak yine de derleyicinin dosyasındaki özgün satır numaralandırmasını temel alarak çıkış oluşturmasını istiyorsanız, satırları kaldırabilir ve kullanarak #lineözgün satır numaralandırmasının benzetimini yapabilirsiniz.

yönergesi #line hidden , hata ayıklayıcıdan ardışık satırları gizler; böylece geliştirici kodda adım adım ilerlediğinde, a #line hidden ile sonraki #line yönerge arasındaki tüm satırlar (başka bir #line hidden yönerge olmadığı varsayılarak) devredilir. Bu seçenek, ASP.NET kullanıcı tanımlı ve makine tarafından oluşturulan kod arasında ayrım yapmak için de kullanılabilir. bu özelliğin birincil tüketicisi ASP.NET olsa da, büyük olasılıkla daha fazla kaynak oluşturucu bu özelliği kullanmaktadır.

Yönerge #line hidden , hata raporlamadaki dosya adlarını veya satır numaralarını etkilemez. Başka bir ifadeyle, derleyici gizli bir blokta hata bulursa, derleyici hatanın geçerli dosya adını ve satır numarasını bildirir.

yönergesi #line filename , derleyici çıkışında görünmesini istediğiniz dosya adını belirtir. Varsayılan olarak, kaynak kod dosyasının gerçek adı kullanılır. Dosya adı çift tırnak işareti ("") içinde olmalı ve bir satır numarasını izlemelidir.

#line yönergesinin yeni bir biçimini kullanabilirsiniz:

#line (1, 1) - (5, 60) 10 "partial-class.cs"
/*34567*/int b = 0;

Bu formun bileşenleri şunlardır:

  • (1, 1): Yönergeyi izleyen satırdaki ilk karakterin başlangıç satırı ve sütunu. Bu örnekte, sonraki satır 1. satır, sütun 1 olarak bildirilir.
  • (5, 60): İşaretli bölgenin bitiş satırı ve sütunu.
  • 10: Yönergenin #line etkili olması için sütun uzaklığı. Bu örnekte, 10. sütun birinci sütun olarak bildirilir. Bildirim int b = 0; bu sütunda başlar. Bu alan isteğe bağlıdır. Belirtilmezse, yönerge ilk sütunda geçerlilik kazanır.
  • "partial-class.cs": Çıkış dosyasının adı.

Yukarıdaki örnek aşağıdaki uyarıyı oluşturur:

partial-class.cs(1,5,1,6): warning CS0219: The variable 'b' is assigned but its value is never used

Yeniden eşlemeden sonra değişkeni b , dosyasının partial-class.csilk satırında, altıncı karakterdedir.

Etki alanına özgü diller (DLL'ler) genellikle kaynak dosyadan oluşturulan C# çıkışına daha iyi bir eşleme sağlamak için bu biçimi kullanır. Bu genişletilmiş #line yönergesinin en yaygın kullanımı, oluşturulan bir dosyada görünen uyarıları veya hataları özgün kaynakla yeniden eşlemektir. Örneğin, şu razor sayfasını göz önünde bulundurun:

@page "/"
Time: @DateTime.NowAndThen

özelliği DateTime.Now olarak DateTime.NowAndThenyanlış yazıldı. Bu razor kod parçacığı için oluşturulan C# öğesinde page.g.csaşağıdaki gibi görünür:

  _builder.Add("Time: ");
#line (2, 6) - (2, 27) 15 "page.razor"
  _builder.Add(DateTime.NowAndThen);

Yukarıdaki kod parçacığı için derleyici çıkışı:

page.razor(2, 2, 2, 27)error CS0117: 'DateTime' does not contain a definition for 'NowAndThen'

page.razor'daki 2. satır, 6. sütun, metin @DateTime.NowAndThen'in (2, 6) tarafından yönergede belirtildiği yerde başladığı yerdir. @DateTime.NowAndThen alanı, yönergedeki (2, 27) tarafından belirtildiği gibi 2. satır, 27. sütunda sona erer. DateTime.NowAndThen metni, yönergede page.g.cs tarafından işaretlendiği gibi 15'in 15. sütununda başlar. Derleyici, hatanın page.razorkonumunda olduğunu bildirir. Geliştirici, oluşturulan kaynakta değil doğrudan kaynak kodundaki hataya gidebilir.

Bu biçimin diğer örneklerini görmek için örnekler bölümündeki özellik belirtimine bakın.

Pragmalar

Derleyici, dosyayı göründüğü yerde derlemek için özel yönergeler almak için kullanır #pragma . Derleyici, kullandığınız pragmaları desteklemelidir. Başka bir deyişle, özel ön işleme yönergeleri oluşturmak için kullanamazsınız #pragma .

#pragma pragma-name pragma-arguments

pragma-name tanınan bir pragmanın adıdır. pragma-arguments pragma özgü bağımsız değişkenlerdir.

#pragma uyarısı

#pragma warning bazı uyarıları etkinleştirebilir veya devre dışı bırakabilir. #pragma warning disable format ve #pragma warning enable format, Visual Studio'nun kod bloklarını nasıl biçimlendirdiğini denetler.

#pragma warning disable warning-list
#pragma warning restore warning-list

warning-list , gibi 414, CS3021uyarı numaralarının virgülle ayrılmış bir listesidir. "CS" ön eki isteğe bağlıdır. Uyarı numaraları belirtmediğinizde, disable tüm uyarıları devre dışı bırakır ve restore tüm uyarıları etkinleştirir.

Not

Visual Studio'da uyarı numaralarını bulmak için projenizi derleyin ve çıkış penceresinde uyarı numaralarını arayın.

, disable kaynak dosyanın bir sonraki satırından başlayarak geçerlilik kazanır. Uyarı, öğesini izleyen satıra restoregeri yüklenir. Dosyada yoksa restore , uyarılar aynı derlemedeki sonraki dosyaların ilk satırında varsayılan durumlarına geri yüklenir.

// pragma_warning.cs
using System;

#pragma warning disable 414, CS3021
[CLSCompliant(false)]
public class C
{
    int i = 1;
    static void Main()
    {
    }
}
#pragma warning restore CS3021
[CLSCompliant(false)]  // CS3021
public class D
{
    int i = 1;
    public static void F()
    {
    }
}

warning pragması'nın başka bir biçimi, kod bloklarında Visual Studio biçimlendirme komutlarını devre dışı bırakır veya geri yükler:

#pragma warning disable format
#pragma warning restore format

Visual Studio biçim komutları, disable format etkin olduğu kod bloklarındaki metinleri değiştirmez. Ctrl+K, Ctrl+Dgibi biçim komutları bu kod bölgelerini değiştirmez. Bu pragma, kodunuzun görsel sunumu üzerinde ayrıntılı denetim sağlar.

#pragma sağlama toplamı

ASP.NET sayfalarında hata ayıklamaya yardımcı olması için kaynak dosyalar için sağlama toplamları oluşturur.

#pragma checksum "filename" "{guid}" "checksum bytes"

yönergesi, değişiklik veya güncelleştirmeleri izlemek için dosyanın adı olarak, "{guid}" karma algoritmasının Genel Benzersiz Tanımlayıcısı (GUID) olarak ve "checksum_bytes" sağlama toplamının baytlarını temsil eden onaltılık basamak dizesi olarak kullanır"filename". Çift sayıda onaltılık basamak sağlamanız gerekir. Tek sayıda basamak derleme zamanı uyarısına neden olur ve yönergesi yoksayılır.

Visual Studio hata ayıklayıcısı, her zaman doğru kaynağı bulduğundan emin olmak için bir sağlama toplamı kullanır. Derleyici bir kaynak dosyanın sağlama toplamını hesaplar ve ardından çıkışı program veritabanı (PDB) dosyasına yayar. Hata ayıklayıcı, kaynak dosya için hesaplayan sağlama toplamıyla karşılaştırmak için PDB'yi kullanır.

Hesaplanan sağlama toplamı .aspx dosyası yerine oluşturulan kaynak dosyaya yönelik olduğundan bu çözüm ASP.NET projelerde çalışmaz. Bu sorunu gidermek için ASP.NET #pragma checksum sayfaları için sağlama toplamı desteği sağlar.

Visual C# içinde bir ASP.NET projesi oluşturduğunuzda, oluşturulan kaynak dosya kaynağın oluşturulduğu .aspx dosyası için bir sağlama toplamı içerir. Derleyici daha sonra bu bilgileri PDB dosyasına yazar.

Derleyici dosyada bir #pragma checksum yönerge bulamazsa sağlama toplamını hesaplar ve değeri PDB dosyasına yazar.

class TestClass
{
    static int Main()
    {
        #pragma checksum "file.cs" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "ab007f1d23d9" // New checksum
    }
}