2009-02-02 21 views
75

C# dili hakkında daha fazla bilgi edinmek için çalışıyorlar, ama bir O sadece daha fazla karışıklık eklersiniz geliyor banaC# ad alanı takma adı - ne anlamı var?

using someOtherName = System.Timers.Timer; 

gibi aliasing ad kullanmak istiyorsunuz nerede bir durum görmek mümkün olmamıştır dili anlamak için. Bir tane açıklayabilir misiniz lütfen.

Teşekkür

bir tür takma değil, bir ad takma
+4

C# içindeki int = System.Int32'yi kullanarak bir sistem geneli ne dersiniz? Faydalı değil mi? Başka bir yerden yararlanılabilen aynı kullanım. – nawfal

+0

@nawfal Tür takma adlarının ihraç edilemeyeceğine inanıyorum. Anlam olarak int = System.Int32'yi kullanarak bir şey tanımlayamazsınız ve bunu bildiren dosya dışındaki yerlerde kullanabilirsiniz. Yani bu int 'Int32'ye ait diğer adlar başka yollarla da elde edilebilir veya derleyici/çalışma zamanında özel bir şey olabilir. – KFL

+0

@KFL bu doğru, ancak her iki fayda aynı doğaya sahip. – nawfal

cevap

121

; Aynı dosyada size hem System.Windows.Forms.Timer ve System.Timers.Timer kullanırsanız',

Aksi halde: (Timer ;-p seçimi için teşekkür ps)

using WinformTimer = System.Windows.Forms.Timer; 
using ThreadingTimer = System.Threading.Timer; 

: karşı, örneğin - belirsizliği giderecek yararlıdır d tam isimleri vermeye devam etmeli (Timer kafa karıştırıcı olabilir).

Ayrıca, farklı derlemelerdeki aynı tam nitelikli tür adına sahip, nadir, ancak desteklenmesi yararlı olan türleri kullanmak için extern takma adlarıyla bir bölüm oynar. Eğer bir tip hızlı erişim istediğinizde, ancak bazı çelişkili uzatma yöntemleri ... biraz dolambaçlı alamıyor çünkü düzenli using kullanmak istemiyorsanız:


Aslında başka kullanımını görebilirsiniz ama burada ...

namespace RealCode { 
    //using Foo; // can't use this - it breaks DoSomething 
    using Handy = Foo.Handy; 
    using Bar; 
    static class Program { 
     static void Main() { 
      Handy h = new Handy(); // prove available 
      string test = "abc";    
      test.DoSomething(); // prove available 
     } 
    } 
} 
namespace Foo { 
    static class TypeOne { 
     public static void DoSomething(this string value) { } 
    } 
    class Handy {} 
} 
namespace Bar { 
    static class TypeTwo { 
     public static void DoSomething(this string value) { } 
    } 
} 
+8

Ad alanlarını veya adlarını takmak için kullanılabilir. –

+1

@Sean: evet, ama verilen örnek bir tür için –

+0

@ lippefiasco idi: OP'nin uygun kullanımı için 'System.Timers.Timer'; --p –

3

size birden çok ad alanı dahil aynı ada sahip birden çok sınıfları olduğunda çok yararlıdır ... bir örnek. Örneğin ...

namespace Something.From.SomeCompanyA { 
    public class Foo { 
     /* ... */ 
    } 
} 

namespace CompanyB.Makes.ThisOne { 
    public class Foo { 
     /* ... */ 
    } 
} 
Sen derleyici mutlu etmek için takma adları kullanabilir ve takımında sen ve diğerleri için daha net şeyler yapmak için

:

using CompanyA = Something.From.CompanyA; 
using CompanyB = CompanyB.Makes.ThisOne; 

/* ... */ 

CompanyA.Foo f = new CompanyA.Foo(); 
CompanyB.Foo x = new CompanyB.Foo(); 
6

Hep böyle durumlarda kullanmak Utility aksi ayrı bir bağlamda olurdu

using Utility = MyBaseNamespace.MySubNamsepace.Utility; 

(gibi MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility), ancak G/ Utility tercih her zaman bu tek p işaret bekliyoruz eklem sınıfı.

6

Zorluk.

Tip adlarını paylaşan ad alanları arasında netlik sağlamanın yararları vardır, ancak aslında yalnızca şekerdir.

+0

Açıkça hangi simgeyi kullandığınızı gösterir. Bu sadece şeker değil, birazcık ayrıntı (yeni bir isim tanımlamak istemiyorsanız) değildir. –

21

Ben sadece [örnek olarak] gibi bir şey yapabileceğini çelişkili alt ad ve/veya nesne adları ile birden çok ad alanı varken bunu kullanmak:

using src = Namespace1.Subspace.DataAccessObjects; 
using dst = Namespace2.Subspace.DataAccessObjects; 

... 

src.DataObject source = new src.DataObject(); 
dst.DataObject destination = new dst.DataObject(); 

aksi yazılı gerekecekti:

Namespace1.Subspace.DataAccessObjects.DataObject source = 
    new Namespace1.Subspace.DataAccessObjects.DataObject(); 

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
    new Namespace2.Subspace.DataAccessObjects.DataObject(); 

Bir ton yazmayı kaydeder ve kodun okunmasını daha kolay hale getirmek için kullanılabilir.

3

Tüm ad alanlarımız için ad alanı takma adlarını tanımladık.

using System.Web.WebControls; 
// lots of other using statements 

// contains the domain model for project X 
using dom = Company.ProjectX.DomainModel; 
// contains common web functionality 
using web = Company.Web; 
// etc. 

ve

// User from the domain model 
dom.User user = new dom.User(); 
// Data transfer object 
dto.User user = new dto.User(); 
// a global helper class 
utl.SomeHelper.StaticMethod(); 
// a hyperlink with custom functionality 
// (as opposed to System.Web.Controls.HyperLink) 
web.HyperLink link = new web.HyperLink(); 

Biz adlar adlandırılmış olması gerekir ve herkes bunları kullanarak nasıl bazı yönergeler tanımlamış: Bu sınıf, örneğin nereden geldiğini çok kolay görmeyi kolaylaştırır.

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>(); 

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {} 

Karşı:

using FooDict = Dictionary<string, SomeClassWithALongName>; 

FooDict foo = new FooDict(); 

private void DoStuff(FooDict dict) {} 
+1

Sık sık takma adın, nesnenin fiziksel konumundan ziyade kullanıldığı bağlamla daha fazla ilgisi olduğunu görmüyor musunuz? – BenAlabaster

13

, (daha doğrusu ad takma adları yerine) tipi takma adları kullanışlı olabilir Birim testinde faydalıdır. Eğer birim testleri yazarken, ortak bir uygulama

MyClass myClassUT; 

konu U nder, T est myClassUT olup olmadığına konuyu ilan etmektir. Peki bir birim testleri yazmak isterseniz Statik sınıf statik yöntemlerle mi?

using MyStaticClassUT = Namespace.MyStaticClass; 

Sonra bu gibi birim testleri yazabilirsiniz:

public void Test() 
{ 
    var actual = MyStaticClassUT.Method(); 
    var expected = ... 
} 

ve test altında konu ne olduğu asla gevşek görme Sonra böyle bir takma ad oluşturabilir.

1

Ben takma ad çok bulmak defalarca genel türler bahsederken bahsedilen örneklere ek olarak

2

Visual Studio'da kodlama yaparken bir şekilde çok kullanışlıdır.

Kullanım örneği: Yalnızca birkaç sınıfı kullanmam gerektiğini varsayalım, örn. System.Data bir ad alanından SqlConnection. aşağıda gösterildiği gibi normal seyrinde ben * .cs dosyasının en üstünde System.Data.SqlClient ad almak gerekir:

using System.Data; 

Şimdi benim intellisense bak. Kod editöründe yazarken seçim yapmak için sınıfların bir sürü ile ağır bir şekilde çoğalır. Ben hiç sınıfların sürü kullanmak için gitmiyorum:

enter image description here

Yani Doğrusu benim * .cs dosyasının en üstünde bir takma ad kullanmak ve net bir intellisense görünüm alacağı:

using SqlDataCon = System.Data.SqlClient.SqlConnection 

Şimdi intellisense görünümüme bakın. Süper net ve süper temiz. Bildiğim

enter image description here

0

bir nedeni; İçe aktarılan ad alanlarından ad çakışmaları olduğunda daha kısa adlar kullanmanıza olanak tanır. Örnek: Eğer isim ModifierKeys hem System.Windows.Forms.Control ve System.Windows.Input ad alanlarında olduğunu öğrenebilir ModifierKeys erişmek giderken

aynı dosyada using System.Windows.Forms; ve using System.Windows.Input; ilan edin. using Input = System.Windows.Input; bildirerek Input.ModifierKeys aracılığıyla System.Windows.Input.ModifierKeys'u alabilirsiniz.

C# tutkalı değilim ama diğer ad alanı benim için "en iyi uygulama" gibi görünüyor. Bu şekilde ne aldığınızı biliyorsunuz ve hala çok daha fazla yazmanız gerekmiyor.