2013-06-10 4 views
16

Ich habe versucht, Verweis in der Microsoft Developer-Website zu erhalten, was die Funktion der: wirklich ist, aber ich kann es nicht finden, weil es scheint, dass es weder ein Schlüsselwort noch ein Operator ist also die Funktion des Doppelpunkts in C# ? Auch habe ich gesehen, dass es auf eine Methode angewendet wird, wie funktioniert das?In C# in welche Kategorie fällt der Doppelpunkt ":" und was bedeutet das wirklich?

+1

Es ist ein Zeichen, das ein Teil von Ausdrücken/Anweisungen ist, einschließlich des ternären Operators und der case-Anweisung. Um was genau bitten Sie? –

+0

Mögliches Duplikat davon? http://stackoverflow.com/questions/338398/thisfoo-syntax-in-c-sharp-constructors –

+0

Nicht doppelt. Das war die Frage über die Erweiterung von Konstruktoren nicht den Zweck von ':' – FabianCook

Antwort

43

Colons sind in sieben grundsätzlich verschiedenen Orten verwendet (das ich sich vorstellen kann, mit Hilfe von jedem in den Kommentaren):

  • einen Klassennamen von seiner Basisklasse/Interface-Implementierungen in Klassendefinitionen Trennung oder in generische Einschränkung Definitionen

    public class Foo : Bar { } 
    
    public class Foo<T> where T : Bar { } 
    
    public void Foo<T>() where T : Bar { } 
    
  • angibt, wie auf der aktuellen Klasse einen anderen Konstruktor aufzurufen oder ein Konstruktor der Basisklasse vor dem aktuellen Konstruktor

    public Foo() : base() { } 
    
    public Foo(int bar) : this() { } 
    
  • den globalen Namensraum angeben (als C. Lang weist darauf hin, das ist die namespace alias qualifier)

    global::System.Console 
    
  • Angeben Attribut Ziele

    [assembly: AssemblyVersion("1.0.0.0")] 
    
  • Angeben von Parameternamen

    Console.WriteLine(value: "Foo"); 
    
  • Als Teil eines ternären Ausdruck

    var result = foo ? bar : baz; 
    
  • Als Teil eines case oder goto Etikett

    switch(foo) { case bar: break; } 
    
    goto Bar; 
    Foo: return true; 
    Bar: return false; 
    
  • Da C# 6 für

    in interpolierten strings Formatierungs

In allen diesen Fällen wird der Doppelpunkt nicht als Operator oder Schlüsselwort verwendet (mit Ausnahme von ::). Es fällt in die Kategorie der einfachen syntaktischen Symbole, wie [] oder {}. Sie sind nur da, um den Compiler genau wissen zu lassen, was die anderen Symbole um sie herum bedeuten.

+1

+1 Auch bei der Angabe von 'where T: IEnumerable' (Typ Constraint Specifier) ​​ –

+0

Wie Kirk Woll in den Kommentaren oben vorgestellt - vergessen Sie nicht den Ternary-Operator (x == true?" Yes ":" no "); – barrypicker

+0

Und die 'case Something:' Anweisung –

3

Die Antwort von ps.sw.g ist ziemlich genau das, was ich vorhatte (ließ meinen Entwurf fallen, als ich seinen Posten sah), und es sollte die akzeptierte Antwort sein.

Aber ich stimme nicht zu, dass generische Art Einschränkung ist die gleiche Verwendung von : als Vererbung angeben.

Hier ist ein Beispiel:

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

Die : zwischen MyClass<T> und IMyClass gibt Vererbung. Die : zwischen where T und IEnumerable gibt eine Typbeschränkung an. Typabhängigkeiten können auf Methoden angewendet werden, nicht auf Vererbung. Die beiden Konzepte haben nichts gemeinsam.

@pswg nette antwort, prost!

+0

+1 Ich werde definitiv zustimmen, dass Vererbung/Interface-Implementierung und generische Typ-Constraint völlig unterschiedliche Konzepte sind (auch wenn sie oberflächlich ähnlich aussehen). –

+0

Was bedeutet Typenzwang? ist es wie in welcher Reihenfolge zum Beispiel der Konstruktor aufgerufen wird? oder etwas unter diesen Linien? – Alan

+1

Generische Typen, wie zum Beispiel 'Nullable ', haben manchmal Einschränkungen für die Typen, die 'T' repräsentieren - 'Nullable ' zum Beispiel kann nur einen Werttyp für 'T' annehmen; Sie können aus diesem Grund keine Nullable 'oder' Nullable 'haben. –