1473 Stimmen

Versteckte Eigenschaften von C#?

Dies kam mir in den Sinn, nachdem ich folgendes erfahren hatte diese Frage :

where T : struct

Wir, die C#-Entwickler, kennen alle die Grundlagen von C#. Ich meine Deklarationen, Konditionale, Schleifen, Operatoren usw.

Einige von uns beherrschten sogar die Dinge wie Generika , anonyme Typen , lambdas , LINQ , ...

Aber was sind die versteckten Funktionen oder Tricks von C#, die selbst C#-Fans, -Süchtige und -Experten kaum kennen?

Hier sind die bisher enthüllten Funktionen:

Schlüsselwörter

Attribute

Syntax

  • ?? (Koaleszenz-Nullen) Operator durch kokos
  • Nummerierung der Markierungen durch Nick Berardi
  • where T:new par Lars Mæhlum
  • Implizite Generika durch Keith
  • Ein-Parameter-Lambdas durch Keith
  • Auto-Eigenschaften von Keith
  • Namespace-Aliase von Keith
  • Verbatim-String-Literale mit @ durch Patrick
  • enum Werte von lfoust
  • @variablennamen von marxidad
  • event Betreiber von marxidad
  • Formatieren von String-Klammern durch Portman
  • Modifikatoren für die Zugänglichkeit der Eigenschaft accessor durch xanadont
  • Bedingter (ternärer) Operator ( ?: ) durch JasonS
  • checked y unchecked Betreiber von Binoj Antony
  • implicit and explicit Betreiber von Flory

Sprachliche Merkmale

Visual Studio-Funktionen

Rahmenwerk

Methoden und Eigenschaften

  • String.IsNullOrEmpty() Methode von KiwiBastard
  • List.ForEach() Methode von KiwiBastard
  • BeginInvoke() , EndInvoke() Methoden von Will Dean
  • Nullable<T>.HasValue y Nullable<T>.Value Eigenschaften von Rismo
  • GetValueOrDefault Methode von John Sheehan

Tipps und Tricks

  • Nette Methode für Ereignisbehandler von Andreas H.R. Nilsson
  • Vergleiche in Großbuchstaben durch John
  • Zugriff auf anonyme Typen ohne Reflexion durch dp
  • Eine schnelle Möglichkeit, Sammlungseigenschaften zu instanziieren, indem man Will
  • JavaScript-ähnliche anonyme Inline-Funktionen durch roosteronacid

Andere

153voto

denis phillips Punkte 12174

Rückgabe anonymer Typen aus einer Methode und Zugriff auf Mitglieder ohne Reflexion.

// Useful? probably not.
private void foo()
{
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) });
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges);
}

object GetUserTuple()
{
    return new { Name = "dp", Badges = 5 };
}    

// Using the magic of Type Inference...
static T AnonCast<T>(object obj, T t)
{
   return (T) obj;
}

42 Stimmen

Das bringt Ihnen wirklich gar nichts. Es ist sogar gefährlich. Was ist, wenn GetUserTuple so geändert wird, dass es mehrere Typen zurückgibt? Der Cast wird zur Laufzeit fehlschlagen. Eine der großartigen Eigenschaften von C#/.Net ist die Kompilierzeitprüfung. Es wäre viel besser, einfach einen neuen Typ zu erstellen.

9 Stimmen

@Jason Ich habe gesagt, dass es wahrscheinlich nicht nützlich ist, aber es ist überraschend (und ich dachte, es wäre versteckt).

31 Stimmen

Das ist zwar cool, scheint aber eine eher schlechte Wahl zu sein. Sie haben den anonymen Typ im Grunde an zwei Stellen definiert. An diesem Punkt, deklarieren Sie einfach eine echte Struktur und verwenden Sie es direkt.

146voto

Patrick Punkte 86090

Hier ist ein nützliches Beispiel für reguläre Ausdrücke und Dateipfade:

"c:\\program files\\oldway"
@"c:\program file\newway"

Das @ weist den Compiler an, alle Escape-Zeichen in einer Zeichenkette zu ignorieren.

27 Stimmen

Eine @-Konstante kann auch Zeilenumbrüche enthalten. Perfekt, wenn man ein mehrzeiliges Skript einer Zeichenkette zuweisen will.

11 Stimmen

Vergessen Sie nicht, auch Anführungszeichen zu vermeiden, indem Sie sie einfach verdoppeln, mit anderen Worten. [code]var candy = @"Ich mag ""rote"" Zuckerstangen.";[/code]

5 Stimmen

Ich neige dazu, Pfade mit Path.Combine zu erstellen. Ich verwende definitiv das @ für Regex!

141voto

Dmitri Nesteruk Punkte 21873

Mixins. Wenn Sie eine Funktion zu mehreren Klassen hinzufügen möchten, aber nicht eine Basisklasse für alle verwenden können, implementieren Sie eine Schnittstelle (ohne Mitglieder) in jeder Klasse. Schreiben Sie dann eine Erweiterungsmethode für die Schnittstelle d.h.

public static DeepCopy(this IPrototype p) { ... }

Natürlich geht dies zu Lasten der Klarheit. Aber es funktioniert!

4 Stimmen

Ja, ich denke, das ist die wahre Stärke der Erweiterungsmethoden. Sie ermöglichen im Grunde Implementierungen von Schnittstellenmethoden.

0 Stimmen

Dies ist auch praktisch, wenn Sie NHibernate (oder Castle ActiveRecord) verwenden und Schnittstellen für Ihre Sammlungen verwenden müssen. Auf diese Weise können Sie den Sammlungsschnittstellen ein Verhalten zuweisen.

0 Stimmen

Das ist im Grunde die Art und Weise, wie alle LINQ-Methoden implementiert sind, um es kurz zu machen.

130voto

Michael Stum Punkte 172055

Ich weiß allerdings nicht, warum jemand Nullable<bool> verwenden sollte :-)

Wahr, Falsch, FileNotFound ?

87 Stimmen

Wenn ein Benutzer eine Ja-Nein-Frage beantworten soll, wäre Null angemessen, wenn die Frage nicht beantwortet wurde

0 Stimmen

Omar ist auf dem richtigen Weg - stellen Sie sich ein Webformular mit zwei Optionsfeldern "Ja" und "Nein" vor, aber ohne Standardauswahl. Wenn der Benutzer das Formular abschickt, ohne eine der beiden Schaltflächen anzuklicken, haben Sie eine Nullauswahl. Könnte auch nützlich sein für etwas wie "Waren wir erfolgreich, sind wir gescheitert, warten wir noch auf das Ergebnis?"

0 Stimmen

Ich verwende das in ähnlicher Weise in einer Klasse, die als Filter dient. Sie können ein bool? auf true/false setzen oder es einfach als null belassen, um zu sagen "Nicht nach dieser Spalte filtern". Aber trotzdem MUSSTE jemand das FileNotFound-Thema ansprechen, vor allem, nachdem jemand anderes bereits die Grundlagen dafür geschaffen hat.

116voto

Brad Wilson Punkte 64944

Dieser ist nicht so sehr "versteckt", sondern nur falsch benannt.

Viel Aufmerksamkeit wird den Algorithmen "map", "reduce" und "filter" gewidmet. Was die meisten Leute nicht wissen, ist, dass .NET 3.5 alle drei dieser Algorithmen hinzugefügt hat, ihnen aber sehr SQL-ähnliche Namen gegeben hat, die darauf beruhen, dass sie Teil von LINQ sind.

"map" => Auswählen
Daten umwandeln von einer Form in eine andere

"reduzieren" => Aggregat
Aggregate Werte zu einem einzigen Ergebnis

"Filter" => Wo
Daten filtern nach einem Kriterium

Die Möglichkeit, LINQ für die Inline-Bearbeitung von Sammlungen zu verwenden, die früher Iterationen und Konditionierungen erforderten, kann unglaublich wertvoll sein. Es lohnt sich zu lernen, wie alle LINQ-Erweiterungsmethoden dazu beitragen können, Ihren Code kompakter und wartbarer zu machen.

0 Stimmen

Select zwingt Sie dazu, immer etwas aus dem übergebenen Ausdruck zurückzugeben, woars map da weniger wählerisch ist.

1 Stimmen

Select funktioniert auch wie die "Return"-Funktion in Monaden. Siehe stackoverflow.com/questions/9033/hidden-features-of-c#405088

1 Stimmen

Die Verwendung von "select" ist nur erforderlich, wenn Sie die SQL-Syntax verwenden. Wenn Sie die Syntax der Erweiterungsmethode verwenden - someCollection.Where(item => item.Price > 5.99M) - ist die Verwendung von select-Anweisungen nicht erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X