Gdzie i kiedy można by użyć aliasingu przestrzeni nazw, takiego jak
using someOtherName = System.Timers.Timer;
Wydaje mi się, że spowodowałoby to tylko większe zamieszanie w zrozumieniu języka.
Gdzie i kiedy można by użyć aliasingu przestrzeni nazw, takiego jak
using someOtherName = System.Timers.Timer;
Wydaje mi się, że spowodowałoby to tylko większe zamieszanie w zrozumieniu języka.
using int = System.Int32
i używać go w miejscach innych niż plik deklaracji. Więc to int
do Int32
aliasu może być osiągnięte w inny sposób lub jest specjalną rzeczą w kompilatorze / środowisku wykonawczym.
using int = System.Int32
jest zarówno błędny, jak i mylący - jest błędny, ponieważ int
alias nie jest zaimplementowany w sposób, który opisałeś. Jest to mylące, ponieważ sugerujesz, że aliasy typów mogą być używane globalnie, tak jak int
jest używane powyżej Int32
.
Odpowiedzi:
To jest alias typu, a nie alias przestrzeni nazw; warto ujednoznacznić - na przykład przed:
using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;
(ps: dzięki za wybór Timer
;-p)
W przeciwnym razie, jeśli użyjesz obu System.Windows.Forms.Timer
i System.Timers.Timer
w tym samym pliku, będziesz musiał nadal podawać pełne nazwy (ponieważ Timer
może to być mylące).
Odgrywa również rolę z extern
aliasami do używania typów o tej samej w pełni kwalifikowanej nazwie typu z różnych zestawów - rzadko, ale przydatne do obsługiwania.
Właściwie widzę inne zastosowanie: gdy chcesz mieć szybki dostęp do typu, ale nie chcesz używać zwykłego, using
ponieważ nie możesz zaimportować niektórych sprzecznych metod rozszerzeń ... trochę zawiłe, ale ... oto przykład ...
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) { }
}
}
System.Timers.Timer
;-p
Używam go, gdy mam wiele przestrzeni nazw z sprzecznymi przestrzeniami nazw podrzędnych i / lub nazwami obiektów, które można po prostu zrobić [jako przykład]:
using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;
...
src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();
Które inaczej musiałoby być napisane:
Namespace1.Subspace.DataAccessObjects.DataObject source =
new Namespace1.Subspace.DataAccessObjects.DataObject();
Namespace2.Subspace.DataAccessObjects.DataObject dstination =
new Namespace2.Subspace.DataAccessObjects.DataObject();
Oszczędza mnóstwo pisania i może być użyty do ułatwienia czytania kodu.
Oprócz wymienionych przykładów aliasy typów (zamiast aliasów przestrzeni nazw) mogą być przydatne, gdy wielokrotnie odwołujemy się do typów ogólnych:
Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();
private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}
Przeciw:
using FooDict = Dictionary<string, SomeClassWithALongName>;
FooDict foo = new FooDict();
private void DoStuff(FooDict dict) {}
Zwięzłość.
Istnieją dodatkowe korzyści, aby zapewnić przejrzystość między przestrzeniami nazw, które mają wspólne nazwy typów, ale zasadniczo to tylko cukier.
Jest to bardzo przydatne, gdy masz wiele klas o tej samej nazwie w wielu dołączonych przestrzeniach nazw. Na przykład...
namespace Something.From.SomeCompanyA {
public class Foo {
/* ... */
}
}
namespace CompanyB.Makes.ThisOne {
public class Foo {
/* ... */
}
}
Możesz użyć aliasów, aby uszczęśliwić kompilator i uczynić rzeczy bardziej przejrzystymi dla siebie i innych członków zespołu:
using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;
/* ... */
CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();
Zdefiniowaliśmy aliasy przestrzeni nazw dla wszystkich naszych przestrzeni nazw. Dzięki temu bardzo łatwo jest sprawdzić, skąd pochodzi klasa, np .:
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.
i
// 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();
Zdefiniowaliśmy kilka wskazówek, jak należy nazywać aliasy i wszyscy ich używają.
Uważam, że aliasy są bardzo przydatne w testach jednostkowych. Podczas pisania testów jednostkowych powszechną praktyką jest deklarowanie przedmiotu do testu jako
MyClass myClassUT;
bycie myClassUT
przedmiotem U nder T est. A co jeśli chcesz napisać testy jednostkowe dla klasy statycznej z metodami statycznymi? Następnie możesz utworzyć taki alias:
using MyStaticClassUT = Namespace.MyStaticClass;
Następnie możesz napisać swoje testy jednostkowe w następujący sposób:
public void Test()
{
var actual = MyStaticClassUT.Method();
var expected = ...
}
i nigdy nie tracisz z oczu tego, czym jest testowany przedmiot.
Z jednej strony jest to bardzo przydatne podczas kodowania w Visual Studio.
Przykład zastosowania : Powiedzmy, że mam użyć tylko kilku klas, np. SqlConnection
Z przestrzeni nazw System.Data
. Normalnie zaimportuję System.Data.SqlClient
przestrzeń nazw na górze pliku * .cs, jak pokazano poniżej:
using System.Data;
Spójrz teraz na mój intelisens. Jest mocno rozpowszechniony z całą masą klas do wyboru podczas pisania w edytorze kodu. W ogóle nie zamierzam korzystać z całej masy zajęć:
Dlatego wolałbym raczej użyć aliasu na górze mojego pliku * .cs i uzyskać wyraźny widok IntelliSense:
using SqlDataCon = System.Data.SqlClient.SqlConnection
Spójrz teraz na mój intelisensowny widok. Jest super-przejrzysty i super-czysty.
Znam jeden powód; Pozwala używać krótszych nazw w przypadku kolizji nazw z importowanych przestrzeni nazw. Przykład:
Jeśli zadeklarowałeś using System.Windows.Forms;
iw using System.Windows.Input;
tym samym pliku, kiedy chcesz uzyskać dostęp ModifierKeys
, może się okazać, że nazwa ModifierKeys
znajduje się zarówno w przestrzeni nazw, jak System.Windows.Forms.Control
i System.Windows.Input
. Więc deklarując, using Input = System.Windows.Input;
że możesz przejść System.Windows.Input.ModifierKeys
przezInput.ModifierKeys
.
Nie jestem fanem C #, ale aliasowanie przestrzeni nazw wydaje mi się „najlepszą praktyką”. W ten sposób wiesz, co otrzymujesz i nadal nie musisz pisać zbyt wiele.
Możesz ich użyć do bardzo łatwej modyfikacji kodu.
Na przykład:
#if USE_DOUBLES
using BNumber = System.Double;
#else
using BNumber = System.Single;
#endif
public void BNumber DoStuff(BNumber n) {
// ...
}
public void BNumber DoStuff2(BNumber n) {
// ...
}
public void BNumber DoStuff3(BNumber n) {
// ...
}
Dzięki prostej zmianie dyrektywy możesz zdecydować, czy cały kod działa w float
lub double
.
using int = System.Int32
w C #? Przydatne, prawda? Jest to takie samo zastosowanie, które można wykorzystać gdzie indziej.