2013-06-10 13 views
16

Próbuję uzyskać odniesienie na stronie Microsoft Developer o tym, co funkcja: naprawdę jest, ale nie mogę go znaleźć, ponieważ wydaje się, że nie jest to słowo kluczowe lub operator, więc co jest funkcją dwukropka w C# ? Również widziałem, jak stosuje się do metody, jak to działa ?.W języku C#, w jakiej kategorii pojawia się dwukropek ":" i co to naprawdę oznacza?

+1

Jest to postać, która jest częścią wyrażeń/zdań, w tym operatora potrójnego i instrukcji case. O co konkretnie pytasz? –

+0

Możliwy duplikat tego? http://stackoverflow.com/questions/338398/thisfoo-syntax-in-c-sharp-constructors –

+0

Nie duplikuj. To było pytanie o rozszerzenie konstruktorów, a nie o celu ':' – FabianCook

Odpowiedz

43

Dwukropki wykorzystywane są w siedmiu fundamentalnie różnych miejscach (które można myślę, z pomocą wszystkich w komentarzach):

  • oddzielających nazwę klasy z podstawy implementacji klasy/interfejsu w definicji klas lub w ogólnych ograniczeń definicje

    public class Foo : Bar { } 
    
    public class Foo<T> where T : Bar { } 
    
    public void Foo<T>() where T : Bar { } 
    
  • Wskazanie jak zadzwonić innego konstruktora na bieżącej klasy lub konstruktora klasy bazowej przed bieżącym konstruktora

    public Foo() : base() { } 
    
    public Foo(int bar) : this() { } 
    
  • Określanie globalnej przestrzeni nazw (jak C. Lang zwraca uwagę, jest to namespace alias qualifier) atrybut

    global::System.Console 
    
  • Określanie skierowany

    [assembly: AssemblyVersion("1.0.0.0")] 
    
  • Określanie nazwy parametrów

    Console.WriteLine(value: "Foo"); 
    
  • W ramach trójskładnikowej ekspresji

    var result = foo ? bar : baz; 
    
  • W ramach case lub goto etykiety

    switch(foo) { case bar: break; } 
    
    goto Bar; 
    Foo: return true; 
    Bar: return false; 
    
  • ponieważ C# 6 dla formatowania interpolowanych łańcuchów

We wszystkich tych przypadkach dwukropek nie jest używany jako operator lub słowo kluczowe (z wyjątkiem ::). Należy do kategorii prostych symboli składniowych, takich jak [] lub . Są po to, aby kompilator wiedział dokładnie, co oznaczają inne symbole wokół nich.

+1

+1 Także przy określaniu 'where T: IEnumerable' (typ ograniczenia ograniczeń) –

+0

Podobnie jak Kirk Woll przedstawione w komentarzach powyżej - nie zapomnij o operator Ternary (x == true?" Yes ":" no "); – barrypicker

+0

I 'case Something:' statement –

3

Odpowiedź od p.s.w.g jest prawie tym, co miałem zamiar wymyślić (upuścił moją wersję roboczą, gdy zobaczyłem jego post), i powinna to być zaakceptowana odpowiedź.

Ale nie zgadzam się, że ograniczenie rodzaju ogólnego jest tym samym użytkowaniem, co : jako określanie dziedziczenia.

Oto przykład:

public MyClass<T> : IMyClass where T : IEnumerable 
{ 
    public DoSomething<TT>(TT foo) where TT : INotifyPropertyChanged 
    { 
     // ... 
    } 
} 

: między MyClass<T> i IMyClass określa dziedziczenie. Parametr : między where T i określa ograniczenie typu. Ograniczenia typu można stosować do metod, a nie dziedziczenia. Te dwa pojęcia nie mają ze sobą nic wspólnego.

@pswg fajna odpowiedź, okrzyki!

+0

+1 Zdecydowanie się zgodzę, że implementacja dziedziczenia/interfejsu i ograniczenie typu generycznego są zupełnie różnymi koncepcjami (nawet jeśli wyglądają podobnie powierzchownie). –

+0

Co oznacza ograniczenie typu? czy to tak, w jakiej kolejności nazywany jest na przykład konstruktor? czy coś w tym stylu? – Alan

+1

Typy ogólne, takie jak 'Nullable ', czasami mają ograniczenia na typach reprezentujących 'T' -' Nullable ', na przykład, mogą przyjmować tylko typ wartości dla' T'; nie możesz mieć 'Nullable ' lub 'Nullable ' z tego powodu. –