.NET'teki her tipin bir namespace ve tip adından oluşan tam bir adı vardır: System.Console, System.Collections.Generic.List<T>, System.Text.StringBuilder. Namespace'ler ilişkili tipleri gruplar ve adların çakışmasını önler; böylece kendi Order ya da Timer sınıfınız kütüphanelerdekilerle bir arada var olabilir. Bir dosyanın en üstündeki using yönergesi bir namespace'i içe aktarır, böylece kısa adları kullanabilirsiniz.
Çıktı:
Cart: tea, honey
1
Bir using yönergesi adları yalnızca derleme zamanında etkiler. Bir kütüphane yüklemez ya da programa kod eklemez; hangi kütüphanelerin kullanılabilir olduğuna projenin referansları ve NuGet paketleri karar verir. Derleyici bir tipin ya da namespace'in "could not be found (are you missing a using directive or an assembly reference?)" olduğunu bildirirse (CS0246 hatası), ya using satırı eksiktir ya da pakete referans verilmemiştir.
Kendi namespace'lerinizi bildirmek
Tipleri bir namespace bloğunun içine koyun. Namespace'ler iç içe olabilir, noktalarla yazılabilir ve aynı namespace birçok dosyaya yayılabilir.
Çıktı:
120.00 via DHL
Shop.Billing.Invoice
namespace Shop.Billing { }, namespace Shop { namespace Billing { } } yazımının kısaltmasıdır. Shop içindeki kod Shop. öneki olmadan Billing.Invoice'a başvurabilir, çünkü adlar önce çevreleyen namespace'lerde aranır.
Gelenekler: şirket ya da ürünle başlayın (Contoso.Payments), ardından özellik ya da katmanı yazın ve klasör yapısıyla eşleştirin (Contoso.Payments/Refunds/RefundService.cs, Contoso.Payments.Refunds'ı tutar). Bir sınıfa asla namespace'iyle aynı adı vermeyin (Shop.Shop); bu, her yerde zahmetli nitelemeye zorlar.
Alias'lar
using Name = Namespace.Type; bir tipe (ya da bir namespace'e) yerel bir ad verir. İki durumda gerekir: uzun bir generic tipi kısaltmak ve bir çakışmayı çözmek.
Çıktı:
latte: 3.60
order 17
Alias'lar yalnızca bildirildikleri dosyada geçerlidir (aşağıdaki gibi global değillerse). C# 12 ve sonrasında bir alias tuple'lar ve diziler dahil her tipi adlandırabilir: using Point = (int X, int Y);.
Belirsiz referanslar (CS0104)
İçe aktarılan iki namespace aynı adda bir tip içerdiğinde kısa adı kullanmak bir hatadır. Klasik örnek System.Threading, System.Timers ve (masaüstü uygulamalarında) System.Windows.Forms içinde bulunan Timer'dır:
using System.Threading;
using System.Timers;
var t = new Timer(1000);
// error CS0104: 'Timer' is an ambiguous reference between
// 'System.Timers.Timer' and 'System.Threading.Timer'
En yerelden en az yerele üç çözüm: tam nitelikli adı yazın (new System.Timers.Timer(1000)), hangisini kastettiğinizi söyleyen bir alias ekleyin ya da ihtiyacınız olmayan yönergeyi kaldırın.
Çıktı:
250
System.Timers.Timer
System.Threading.Timer
Kendi namespace'iniz System ya da Console adında bir tip tanımlıyorsa, global:: öneki aramayı kökten başlatır: global::System.Console.WriteLine("hi");. Üretilen kod bu yüzden onu her yerde kullanır.
using static
using static tek bir tipin statik üyelerini içe aktarır, böylece tip adı olmadan çağrılabilirler. Math gibi aynı sınıfı tekrar tekrar çağıran koda uygundur:
Çıktı:
Area: 28.27
Hypotenuse: 5
42
using static enum'larla (using static System.DayOfWeek; Monday yazmanızı sağlar) ve kendi statik sınıflarınızla da çalışır. Kısa adların belirsiz olmadığı yerlerde kullanın; büyük bir dosyada tek başına WriteLine okuyanları hangi yazıcının kastedildiğini merak ettirebilir.
global using ve dosya kapsamlı namespace'ler (C# 10)
İki C# 10 özelliği dosyaların başındaki kalıp kodu azaltır. Bir global using projedeki her dosyaya uygulanır ve genellikle GlobalUsings.cs gibi tek bir dosyada tutulur:
// GlobalUsings.cs, C# 10 and later
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using Money = System.Decimal;
.NET 6 ve sonraki SDK projeleri bunları sizin için üretebilir. .csproj içinde <ImplicitUsings>enable</ImplicitUsings> ile (yeni şablonlarda varsayılan) bir konsol projesi System, System.Collections.Generic, System.IO, System.Linq, System.Net.Http, System.Threading ve System.Threading.Tasks alır; web projeleri ayrıca ASP.NET Core namespace'lerini de alır. Modern Program.cs dosyalarının doğrudan kodla başlamasının nedeni budur.
Bir dosya kapsamlı namespace, tüm dosyanın namespace'ini blok yerine noktalı virgülle bildirir ve bir girinti seviyesi kazandırır:
// C# 10 and later
namespace Shop.Billing;
public class Invoice
{
public decimal Amount { get; set; }
}
Bir dosyada yalnızca bir dosya kapsamlı namespace olabilir ve aynı dosyada blok namespace'lerle karıştırılamaz. Eski projeler, Unity betikleri ve .NET Framework'ü hedefleyen kod yukarıda gösterilen blok biçimini kullanır.
using yönergeleri nereye yazılır ve using ifadesi
Using yönergeleri dosyadaki tüm namespace ve tip bildirimlerinden önce gelmelidir (global using'ler her şeyden önce). Bir namespace bloğunun içine de yazılabilirler; bu durumda yalnızca orada geçerli olurlar. Stil kılavuzları farklıdır ve çoğu .NET kodu onları en üstte tutar.
using anahtar kelimesinin metotların içinde ikinci, ilgisiz bir görevi vardır: using ifadesi using (var file = File.OpenRead(path)) { ... } blok bittiğinde nesnenin Dispose metodunu çağırarak dosyaları ve bağlantıları kapatır. Anahtar kelimeyi paylaşır, başka hiçbir şeyi değil. using ifadesi sayfasına bakın.
Sıkça Sorulan Sorular
C#'ta using ne işe yarar?
Bir dosyanın en üstündeki using System.Text; bir namespace'i içe aktaran bir yönergedir; böylece System.Text.StringBuilder yerine StringBuilder yazabilirsiniz. Kod eklemez ve hiçbir şey yüklemez; yalnızca adları kısaltır. Bir metodun içindeki using (var f = ...) ise farklı bir özelliktir: using ifadesi, bir nesneyi bloğun sonunda dispose eder.
C#'ta namespace nedir?
Namespace, ad çakışmalarını önleyen ve kodu düzenleyen, adlandırılmış bir tip grubudur; örneğin System.Collections.Generic ya da MyShop.Billing. Farklı namespace'lerde olan iki sınıf aynı adı taşıyabilir. Geleneksel olarak namespace'ler klasör yapısını izler ve şirket ya da ürün adıyla başlar.
C#'ta using static nedir?
using static System.Math; tek bir tipin statik üyelerini içe aktarır; böylece Math. öneki olmadan Sqrt(16) çağırabilir ve PI'yi okuyabilirsiniz. Kendi sınıflarınız ve enum'lar dahil her sınıfla çalışır. Kısa adların anlaşılır kaldığı yerlerde kullanın, örneğin yoğun matematik içeren kodda.
C#'ta "is an ambiguous reference" hatası nasıl düzeltilir?
CS0104 hatası, içe aktarılan iki namespace'in de o adda bir tip içerdiği anlamına gelir; örneğin System.Threading ve System.Timers içindeki Timer. Tam nitelikli adı yazın (System.Timers.Timer), using yönergelerinden birini kaldırın ya da bir alias ekleyin: using Timer = System.Timers.Timer;.
C#'ta global using nedir?
global using System.Text; (C# 10) bir namespace'i yalnızca yazıldığı dosya için değil, projedeki her dosya için içe aktarır. .NET 6 ve sonraki SDK projeleri, <ImplicitUsings>enable</ImplicitUsings> ayarlandığında bir dizi global using'i otomatik üretir; yeni Program.cs dosyalarında hiç using satırı olmamasının nedeni budur.