C# ön işlemci yönergeleri
Derleyicinin ayrı bir ön işlemcisi olsa da, bu bölümde açıklanan yönergeler bir tane var gibi işlenir. Koşullu derlemede yardımcı olmak için bunları kullanırsiniz. C ve C++ yönergelerinin aksine, makro oluşturmak için bu yönergeleri kullanamazsiniz. Önişlemci yönergesi, bir satırda tek yönerge olması gerekir.
Boş değere değiştirilebilir bağlam
#nullableÖnişlemci yönergesi, null değere değiştirilebilir ek açıklama bağlamını ve null değere değiştirilebilir uyarı bağlamını ayarlar. Bu yönerge, null değere değiştirilebilir ek açıklamaların etkili olup olmadığını ve nulllenebilirlik uyarılarının verilip verilme olmadığını kontrol eder. Her bağlam devre dışı veya etkindir.
Her iki bağlam da proje düzeyinde belirtilebilir (C# kaynak kodu dışında). yönergesi #nullable ek açıklama ve uyarı bağlamlarını kontrol eder ve proje düzeyi ayarlarından önceliklidir. Yönerge, başka bir yönerge onu geçersiz kılıncaya kadar veya kaynak dosyanın sonuna kadar denetiminde olduğu bağlamları ayarlar.
Yönergelerin etkisi aşağıdaki gibidir:
#nullable disable: Boş değere değiştirilebilir ek açıklama ve uyarı bağlamlarını devre dışı olarak ayarlar.#nullable enable: Null değere değiştirilebilir ek açıklama ve uyarı bağlamlarını etkin olarak ayarlar.#nullable restore: Boş değere değiştirilebilir ek açıklama ve uyarı bağlamlarını proje ayarlarına geri döndürür.#nullable disable annotations: Boş değere değiştirilebilir ek açıklama bağlamını devre dışı olarak ayarlar.#nullable enable annotations: Null değere değiştirilebilir ek açıklama bağlamını etkin olarak ayarlar.#nullable restore annotations: Boş değere değiştirilebilir ek açıklama bağlamını proje ayarlarına geri döndürür.#nullable disable warnings: Null değere değiştirilebilir uyarı bağlamını devre dışı olarak ayarlar.#nullable enable warnings: Null değere değiştirilebilir uyarı bağlamını etkin olarak ayarlar.#nullable restore warnings: Boş değere değiştirilebilir uyarı bağlamını proje ayarlarına geri döndürür.
Koşullu derleme
Koşullu derlemeyi kontrol etmek için dört önişlemci yönergesi kullanırsiniz:
#if: Yalnızca belirtilen simge tanımlanmışsa kodun derlenmiş olduğu bir koşullu derleme açar.#elif: Önceki koşullu derlemeyi kapatır ve belirtilen simge tanımlandıktan sonra yeni bir koşullu derleme açar.#else: Önceki koşullu derlemeyi kapatır ve önceki belirtilen sembol tanımlanmamışsa yeni bir koşullu derleme açar.#endif: Önceki koşullu derlemeyi kapatır.
C# derleyicisi sonunda bir yönergesi tarafından takip edilen bir yönerge bulduğunda, yalnızca belirtilen sembol tanımlandığı zaman yönergeler arasındaki #if #endif kodu derler. C ve C++ dillerinden farklı olarak bir simgeye sayısal değer ataya yoktur. #ifC# içinde deyimi Boole'dır ve yalnızca sembolün tanımlandığı veya tanımlanmamış olduğunu testler. Örnek:
#if DEBUG
Console.WriteLine("Debug version");
#endif
veya değerlerini test etmek için == işleçleri (eşitlik) ve != (eşitsizlik) bool true false kullanabilirsiniz. true sembolün tanımlandığı anlamına gelir. deyimi #if DEBUG ile aynı anlama #if (DEBUG == true) sahiptir. Birden çok sembolün && tanımlanmamışolup olmadığını değerlendirmek için || (ve), ! (veya) ve (değil) işleçlerini kullanabilirsiniz. Ayrıca, sembolleri ve işleçleri parantezlerle de gruplandır edebilirsiniz.
#if, , , , ve yönergeleriyle birlikte, bir veya daha fazla sembolün varlığına göre kodu dahil veya #else #elif hariç #endif #define #undef tutabilirsiniz. Koşullu derleme, bir hata ayıklama derlemesi için kod derlerken veya belirli bir yapılandırma için derleme sırasında yararlı olabilir.
Bir yönergeyle başlayan koşullu #if yönerge bir yönergeyle açıkça #endif sonlandırılmalı. #define bir sembol tanımlamaya olanak sağlar. İfade, yönergesine geçirilen ifade olarak #if sembolünü kullanarak olarak true değerlendirilir. DefineConstants derleyici seçeneğiyle bir sembol de tanımlayabilirsiniz. ile bir sembolün tanımlarını geri sızdırın. #undef ile oluşturulan sembolün #define kapsamı, içinde tanımlandığı dosyadır. DefineConstants veya ile tanımladığınız simge aynı adı alan #define bir değişkenle çakışmaz. Başka bir ifadeyle, bir değişken adı önişlemci yönergesine geçirilemeli ve bir sembol yalnızca önişlemci yönergesi tarafından değerlendir olabilir.
#elif bileşik koşullu yönerge oluşturmanıza olanak sağlar. önceki #elif veya önceki, isteğe bağlı, yönerge ifadeleri olarak #if #elif değerlendirilmezse ifade true değerlendirilir. Bir ifade olarak değerlendirilirse, derleyici ile sonraki koşullu #elif yönerge arasındaki tüm kodu true #elif değerlendirir. Örnek:
#define VC7
//...
#if debug
Console.WriteLine("Debug build");
#elif VC7
Console.WriteLine("Visual Studio 7");
#endif
#else , önceki veya (isteğe bağlı) yönergelerinde yer alan ifadelerin hiçbiri olarak değerlendirilmezse derleyici ile sonraki arasındaki tüm kodu değerlendirecek şekilde bileşik bir koşullu yönerge oluşturmanıza #if #elif olanak true #else #endif sağlar. #endif(#endif) sonrasındaki bir sonraki önişlemci yönergesi olması #else gerekir.
#endif , yönergesi ile başlayan koşullu yönergenin sonunu #if belirtir.
Derleme sistemi, SDK stili projelerde farklı hedef çerçeveleri temsil eden önceden tanımlanmış önişlemci sembollerinin de farkındadır. Birden fazla .NET sürümünü hedefleyen uygulamalar oluştururken yararlıdır.
| Hedef Çerçeveler | Simgeleri | .NET 5 + SDK 'da kullanılabilen ek simgeler |
|---|---|---|
| .NET Framework | NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, NET40, NET35, NET20 |
NET48_OR_GREATER, NET472_OR_GREATER, NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, NET40_OR_GREATER, NET35_OR_GREATER, NET20_OR_GREATER |
| .NET Standard | NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_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, NET6_0, NET6_0_ANDROID, NET6_0_IOS, NET6_0_MACOS, NET6_0_MACCATALYST, NET6_0_TVOS, NET6_0_WINDOWS, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0 |
NET6_0_OR_GREATER, NET6_0_ANDROID_OR_GREATER, NET6_0_IOS_OR_GREATER, NET6_0_MACOS_OR_GREATER, NET6_0_MACCATALYST_OR_GREATER, NET6_0_TVOS_OR_GREATER, NET6_0_WINDOWS_OR_GREATER, NET5_0_OR_GREATER, NETCOREAPP_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATER, NETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATER, NETCOREAPP2_0_OR_GREATER, NETCOREAPP1_1_OR_GREATER, NETCOREAPP1_0_OR_GREATER |
Not
- Versionless sembolleri, hedeflediğiniz sürümden bağımsız olarak tanımlanmıştır.
- Sürüme özgü semboller yalnızca hedeflediğiniz sürüm için tanımlanmıştır.
<framework>_OR_GREATERSemboller, hedeflediğiniz sürüm ve önceki tüm sürümler için tanımlanır. örneğin, .NET Framework 2,0 ' i hedefliyorsanız, aşağıdaki semboller tanımlanmıştır:NET_2_0,NET_2_0_OR_GREATER,NET_1_1_OR_GREATERveNET_1_0_OR_GREATER.
Not
Geleneksel, SDK stili olmayan projelerde, projenin özellikler sayfaları aracılığıyla farklı hedef çerçeveler için koşullu derleme sembollerini Visual Studio el ile yapılandırmanız gerekir.
Önceden tanımlanmış diğer semboller ve DEBUG TRACE sabitleridir. kullanarak proje için ayarlanmış değerleri geçersiz #define kılebilirsiniz. Örneğin, DEBUG simgesi, derleme yapılandırma özelliklerinize ("Hata Ayıklama" veya "Yayın" modu) bağlı olarak otomatik olarak ayarlanır.
Aşağıdaki örnek, bir dosyada sembol tanımlamayı ve ardından ve MYTEST sembollerinin değerlerini test etmek için nasıl test MYTEST gerçekleştirin? DEBUG Bu örneğin çıktısı, projeyi Hata Ayıklama veya Sürüm yapılandırma modu üzerinde mi yapılandırmasını yerleşik olarak oluşturursunuz.
#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'ler kullanmak için farklı hedef çerçeveleri nasıl test etmek üzere kullanabileceğiniz gösterir:
public class MyClass
{
static void Main()
{
#if NET40
WebClient _client = new WebClient();
#else
HttpClient _client = new HttpClient();
#endif
}
//...
}
Sembolleri tanımlama
Koşullu derleme için sembolleri tanımlamak veya tanımsız olarak tanımlamak için aşağıdaki iki önişlemci yönergesi kullanırsiniz:
#define: Bir sembol tanımlayın.#undef: Bir sembolün tanımlarını geri anın.
Sembol #define tanımlamak için kullanırnız. yönergesine geçirilen ifade olarak sembolünü kullanırken, aşağıdaki örnekte de olduğu gibi #if true ifadesi olarak değerlendirilir:
#define VERBOSE
#if VERBOSE
Console.WriteLine("Verbose output version");
#endif
Not
yönergesi, genellikle C ve C++ ile yapılan #define sabit değerlerin bildir yapılması için kullanılamaz. C# içinde sabitler en iyi şekilde bir sınıfın veya yapının statik üyeleri olarak tanımlanır. Bu tür birkaç sabit varsa, bunları tutmak için ayrı bir "Sabitler" sınıfı oluşturmayı göz önünde bulundurarak.
Semboller, derleme koşullarını belirtmek için kullanılabilir. sembolünü veya ile test #if etmek için . #elif Koşullu derleme gerçekleştirmek için ConditionalAttribute de kullanabilirsiniz. Bir sembol tanımlayabilirsiniz, ancak bir simgeye değer ataya yoktur. Yönerge, #define ön işlemci yönergeleri olmayan herhangi bir yönergeyi kullanmadan önce dosyasında görünecektir. DefineConstants derleyici seçeneğiyle bir sembol de tanımlayabilirsiniz. ile bir sembolün tanımlarını geri sızdırın. #undef
Bölgeleri tanımlama
Aşağıdaki iki önişlemci yönergesi kullanarak bir ana hat içinde daraltılmış kod bölgelerini tanımlayabilirsiniz:
#region: Bir bölgeyi başlat.#endregion: Bir bölgeyi sona erdirin.
#region , kod düzenleyicisinin genel açıklama özelliğini kullanırken genişleterek veya daraltarak bir kod bloğu belirtmenize olanak sağlar. Daha uzun kod dosyalarında bir veya daha fazla bölgeyi daraltabilir veya gizleyebilirsiniz. Böylece dosyanın üzerinde çalışmakta olduğu bölüme odaklanabilirsiniz. Aşağıdaki örnekte, bir bölgenin nasıl tanımladığınız gösterir:
#region MyClass definition
public class MyClass
{
static void Main()
{
}
}
#endregion
Blok #region bir yönergeyle #endregion sonlandırılmalı. Bir #region blok bir blokla #if çakışamaz. Ancak, bir blok bir blokta iç içe ve bir #region #if #if blokta iç içe yer alan bir #region blok olabilir.
Hata ve uyarı bilgileri
Aşağıdaki yönergeleri kullanarak derleyiciye kullanıcı tanımlı derleyici hataları ve uyarıları oluşturması ve satır bilgilerini denetlemesi talimatı verilmiştir:
#error: Belirtilen iletiyle bir derleyici hatası oluştur.#warning: Belirli bir iletiyle bir derleyici uyarısı oluşturma.#line: Derleyici iletileriyle yazdırılan satır numarasını değiştirme.
#error kodundaki belirli bir konumdan CS1029 kullanıcı tanımlı hata oluşturmanızı sağlar. Örnek:
#error Deprecated code in this method.
Not
Derleyici özel bir şekilde davranır ve cs8304 derleyici hatasını, kullanılan derleyici ve dil sürümlerini içeren bir #error version iletiyle raporlar.
#warning kodundaki belirli bir konumdan CS1030 düzeyinde bir derleyici uyarısı oluşturmanızı sağlar. Örnek:
#warning Deprecated code in this method.
#line , derleyicinin satır numaralamasını ve (isteğe bağlı olarak) dosya adı çıktısını hatalar ve uyarılar için değiştirmenize olanak sağlar.
Aşağıdaki örnek, satır numaralarıyla ilişkili iki uyarının nasıl raporlandırılı olduğunu gösterir. yönergesi, sonraki satırın numarasını 200 olarak (varsayılan değer #6 olmasına rağmen) ve sonraki yönergeye kadar dosya adı #line 200 #line "Özel" olarak raporlanır. yönergesi, satır numaralandırmasını varsayılan numaralandırması olarak döndürür ve bu da önceki yönerge tarafından #line default yeniden numaralandırmış 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ışı üretir:
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şleminin otomatik, ara adımlarında kullanılabilir. Örneğin, satırlar özgün kaynak kod dosyasından kaldırıldı ancak yine de derleyicinin dosyada özgün satır numaralamasını temel alarak çıkış oluşturmasını istediyebilirsiniz. Satırları kaldırabilir ve ardından ile özgün satır numaralama simülasyonunu yapmak için #line kullanılabilirsiniz.
yönergesi, geliştirici kodda adım adım ilerlerken bir ile sonraki yönerge arasındaki tüm satırların (başka bir yönerge olmadığını varsayarak) devredecek şekilde, hata ayıklayıcıdan sonraki satırları #line hidden #line hidden #line #line hidden gizler. Bu seçenek, kullanıcı tanımlı ASP.NET makine tarafından oluşturulan kod arasında ayrım yapmak için de kullanılabilir. Bu ASP.NET birincil tüketici olsa da, büyük olasılıkla daha fazla kaynak oluşturucu bunu kullanacaktır.
Yönerge, #line hidden hata raporlamada dosya adlarını veya satır numaralarını etkilemez. Yani, derleyici gizli bir blokta hata bulursa, derleyici hatanın geçerli dosya adını ve satır numarasını raporlar.
#line filenameyönergesi, 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şaretleri ("") içinde olmalı ve önünde bir satır numarası bulunmalıdır.
C# 10'dan itibaren yönergenin yeni bir formunu #line kullanabilirsiniz:
#line (1, 1) - (5, 60) 10 "partial-class.g.cs"
/*34567*/int b = 0;
Bu formun bileşenleri:
(1, 1): yönergesine uygun satırdaki ilk karakterin başlangıç satırı ve sütunu. Bu örnekte, sonraki satır 1. satır, sütun 1 olarak raporlanır.(5, 60): İşaretlenen bölge için bitiş satırı ve sütunu.10: Yönergenin etkili olmak#lineiçin sütun uzaklığı. Bu örnekte, 10. sütun sütun 1. sütun olarak raporlanacak. Bildirim bu şekildeint b = 0;başlar. Bu alan isteğe bağlıdır. Atlanırsa, yönergesi ilk sütunda etkili olur."partial-class.g.cs": Çıktı dosyasının adı.
Yukarıdaki örnek aşağıdaki uyarıyı üretir:
partial-class.g.cs(1,5,1,6): warning CS0219: The variable 'b' is assigned but its value is never used
Yeniden diziledikten sonra değişkeni, ilk satırda altı b karakterindedir.
Etki alanına özgü diller (DSL) genellikle bu biçimi kullanarak kaynak dosyadan oluşturulan C# çıkışına daha iyi bir eşleme sağlar. Bu biçime daha fazla örnek görmek için örnekler bölümündeki özellik belirtimsine bakın.
Pragmalar
#pragma , derleyiciye göründüğü dosyanın derlemesi için özel yönergeler verir. Yönergelerin derleyici tarafından desteklenmiş olması gerekir. Başka bir deyişle, özel ön işleme #pragma yönergeleri oluşturmak için'i kullanalamaz.
#pragma warning: Uyarıları etkinleştirin veya devre dışı bırakma.#pragma checksum: Sağlama sağlamaları oluşturma.
#pragma pragma-name pragma-arguments
Burada pragma-name tanınan pragma adıdır ve pragma-arguments pragma özgü bağımsız değişkenlerdir.
#pragma uyarısı
#pragma warning belirli uyarıları etkinleştir veya devre dışı bırak.
#pragma warning disable warning-list
#pragma warning restore warning-list
Burada, warning-list uyarı numaralarının virgülle ayrılmış bir listesidir. "CS" ön eki isteğe bağlıdır. Hiçbir uyarı numarası belirtilmedinde, tüm disable uyarıları devre dışı bırakarak tüm uyarıları restore sağlar.
Not
Projenizin içinde uyarı Visual Studio için projenizi derlemeniz ve çıkış penceresinde uyarı numaralarını bulmanız gerekir.
disable, kaynak dosyanın sonraki satırına başarak etkili olur. Uyarı, ardından gelen satıra geri restore yüklenir. Dosyada yoksa, uyarılar aynı derlemede sonraki dosyaların ilk satırına restore 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()
{
}
}
#pragma sağlamaları
Farklı sayfalarda hata ayıklamaya yardımcı olmak için kaynak dosyalar için sağlama ASP.NET üretir.
#pragma checksum "filename" "{guid}" "checksum bytes"
Burada, değişiklikler veya güncelleştirmeler için izleme gerektiren dosyanın adı, karma algoritması için Genel Benzersiz Tanımlayıcı (GUID) ve sağlama toplam baytlarını temsil eden onaltılık basamak "filename" "{guid}" "checksum_bytes" dizesidir. Çift sayıda onaltılık basamak olmalıdır. Tek sayıda basamak, derleme zamanı uyarısıyla sonuç verir ve yönergesi yoksayılır.
Hata Visual Studio, her zaman doğru kaynağı bulduğundan emin olmak için sağlama sağlamaları kullanır. Derleyici, kaynak dosya için sağlama toplamını hesaplar ve ardından çıktıyı program veritabanı (PDB) dosyasına yalıtır. Hata ayıklayıcısı daha sonra PDB'i kullanarak kaynak dosya için hesapta yer alan sağlama toplam ile karşılaştırıldığında.
Hesaplanan sağlamaları , .aspx dosyası ASP.NET oluşturulan kaynak dosyaya yönelik olduğundan bu çözüm diğer projelerde kullanılamaz. Bu sorunu çözmek #pragma checksum için, sayfalarda sağlama ASP.NET sağlar.
Visual C# ASP.NET bir proje sanız, oluşturulan kaynak dosya kaynağın oluşturulacak .aspx dosyası için bir sağlama grubu içerir. Derleyici daha sonra bu bilgileri PDB dosyasına yazar.
Derleyici dosyada bir yönerge bulamazsa sağlama toplam değerini hesaplar #pragma checksum ve değeri PDB dosyasına yazar.
class TestClass
{
static int Main()
{
#pragma checksum "file.cs" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "ab007f1d23d9" // New checksum
}
}