Ho cercato di ottenere un riferimento nel sito Web Microsoft Developer su quale sia la funzione del: è davvero ma non riesco a trovarlo perché sembra che non sia né una parola chiave né un operatore, quindi qual è la funzione dei due punti in C #? Inoltre ho visto che viene applicato a un metodo come funziona ?.
I due punti sono utilizzati in sette luoghi fondamentalmente diversi (a cui posso pensare, con l’aiuto di tutti i commenti):
Separazione di un nome di class dalle sue implementazioni di class base / interfaccia nelle definizioni di class o nelle definizioni di vincoli generici
public class Foo : Bar { } public class Foo where T : Bar { } public void Foo () where T : Bar { }
Indicare come chiamare un altro costruttore sulla class corrente o il costruttore di una class base prima del costruttore corrente
public Foo() : base() { } public Foo(int bar) : this() { }
Specificare lo spazio dei nomi globale (come sottolinea C. Lang , questo è il qualificatore dell’alias namespace )
global::System.Console
Specifica degli obiettivi degli attributi
[assembly: AssemblyVersion("1.0.0.0")]
Specifica dei nomi dei parametri
Console.WriteLine(value: "Foo");
Come parte di un’espressione ternaria
var result = foo ? bar : baz;
Come parte di un case
o etichetta goto
switch(foo) { case bar: break; } goto Bar; Foo: return true; Bar: return false;
Dal momento che C # 6 per la formattazione in stringhe interpolate
Console.WriteLine($"{DateTime.Now:yyyyMMdd}");
In tutti questi casi, i due punti non vengono utilizzati come operatore o parola chiave (ad eccezione di ::
:). Cade nella categoria dei semplici simboli sintattici, come []
o {}
. Sono lì solo per far sapere al compilatore cosa significano esattamente gli altri simboli che li circondano.
La risposta di pswg è più o meno quello che stavo per fare (ha abbandonato la mia bozza quando ho visto il suo post), e dovrebbe essere la risposta accettata.
Ma non sono d’accordo sul fatto che il vincolo di tipo generico sia lo stesso di :
specificando l’ereditarietà.
Ecco un esempio:
public MyClass : IMyClass where T : IEnumerable { public DoSomething(TT foo) where TT : INotifyPropertyChanged { // ... } }
Il :
tra MyClass
e IMyClass
specifica l’ereditarietà. Il :
tra where T
e IEnumerable
specifica un vincolo di tipo. I vincoli di tipo possono essere applicati ai metodi, non all’ereditarietà. I due concetti non hanno nulla in comune.
@pswg bella risposta, evviva!