2010-10-07 18 views
20

Mam nadzieję, że przegapiłem to w dokumentach. Czy istnieje sposób, aby zadeklarować synonim typu w C#?Zgłaszanie synonimów typu w C#

+1

znaczy alias a la 'string' jest naprawdę' System.String'? –

+0

tak. MyTuple = Tuple akonsu

Odpowiedz

18

można używać przy użyciu instrukcji, aby utworzyć alias dla typu.

Na przykład, następujące utworzyć alias dla System.Int32 nazwie MyInt

using MyInt = System.Int32; 

Alternatywnie, można użyć dziedziczenia, aby pomóc w niektórych przypadkach. Na przykład

Tworzenie typu People który jest List<Person>

public class People: List<Person> 
{ 
} 

Niekoniecznie aliasem, ale ma uprościć, szczególnie dla bardziej złożonych typów jak ten

public class SomeStructure : List<Dictionary<string, List<Person>>> 
{ 
} 

I teraz można używaj raczej typu SomeStructure niż zabawnej deklaracji ogólnej.

Dla przykładu, który masz w komentarzach, dla Tuple możesz zrobić coś takiego.

public class MyTuple : Tuple<int, string> 
{ 
    public MyTuple(int i, string s) : 
    base(i, s) 
    { 
    } 
} 
+0

Aktualizacja zawierająca niektóre alternatywy, w oparciu o komentarz odnoszący się do Tuple. –

+3

Tak naprawdę, odpowiedź brzmi nie, przynajmniej nie w Haskell. 'using' scopes synonim do pliku lokalnego i nie można zdefiniować dwóch różnych synonimów dla tego samego typu. Dziedziczenie, oprócz bycia _evil_ w sobie, nie ma zastosowania do klas zapieczętowanych, takich jak String, które są typami, których zazwyczaj jesteśmy zainteresowani tworzeniem synonimów. Dodatkowym sposobem "tworzenia" synonimów byłoby enkapsulacja lub adaptery. Utwórz klasę 'MyTuple', która ma instancję' Tuple' ukrytą w środku i przekazuj do niej wszystkie wywołania (oczywiście musisz wdrożyć wszystkie interfejsy typu enkapsulowanego). – drozzy

+0

Możesz również użyć rozszerzeń, aby rozszerzyć klasę bez konieczności jej dziedziczenia lub modyfikowania bezpośrednio. Np. Można dodać metody do klasy String, @drozzy. http://msdn.microsoft.com/en-us/library/bb383977.aspx – ps2goat

8

Czy istnieje sposób zadeklarować synonim typu w C#?

nr

Można utworzyć alias z użyciem ale jest ograniczona do 1 pliku (namespace).

+0

Istnieje 1 trik: http://stackoverflow.com/a/41704128/3241228. To nie jest rozwiązanie dla każdego przypadku, ale jest lepsze niż nic. – user1234567

15

Może szukasz Using Alias Directives:

using MyType = MyNamespace.SomeType; 

Pozwala to, w kodzie, typ:

// Constructs a MyNamespace.SomeType instance... 
MyType instance = new MyType(); 
+1

dziękuję. przytłaczająca ilość odpowiedzi. :) chyba zgubiłem to. chociaż jednym zastrzeżeniem jest to, że nie mogę użyć tego synonimu w innych plikach ... byłoby to miłe. – akonsu

+1

@akonsu: Nie, jest to konstrukcja czasu kompilacji, więc jest to plik (technicznie, na jednostkę kompilacji lub przestrzeń nazw - może być ważna tylko dla ** części ** pliku, w zależności od tego, gdzie ją umieścisz). Musisz skopiować to do dowolnego pliku, w którym chcesz go użyć. Jest to najbliżej C# do "synonim typu". –

3

To brzmi jak mówisz alias które można zadeklarować w swoich sprawozdaniach using na szczycie swoich codefiles:

using MyDate = System.DateTime; 
0

To nie jest najprostszym sposobem rozwiązania tego problemu ale gdy potrzebuję synonimu typu, tworzę klasę z niejawnymi konwersjami do iz typu docelowego, na przykład:

Podana nazwa musi być synonimem ciągu, Następnie można wykonać następujące czynności:

public class Name 
{ 
    public string Value; 
    public static implicit operator string(Name name) { return name.Value; } 
    public static implicit operator Name(string name) { return new Name {Value = name}; } 
} 

Która da ci możliwość używania Typu Nazwa wokół twojego kodu, a kompilator pozwoli Ci przypisać do niego również wartości z łańcucha.

Jeśli sposób następujący podpis:

public void SomeMethodThatNeedsName(Name name) 

Można by to zrobić:

SomeMethodThatNeedsName("aNameThatComesFromString") 
Powiązane problemy