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

751voto

ageektrapped Punkte 14292

Dies ist nicht C# per se, aber ich habe noch niemanden gesehen, der wirklich mit System.IO.Path.Combine() in dem Maße, wie sie es sollten. Tatsächlich ist die gesamte Path-Klasse wirklich nützlich, aber niemand benutzt sie!

Ich bin bereit zu wetten, dass jede Produktionsanwendung den folgenden Code enthält, auch wenn dies nicht der Fall sein sollte:

string path = dir + "\\" + fileName;

583voto

chakrit Punkte 59834

Lambdas und Typinferenz werden unterschätzt. Lambdas können mehrere Anweisungen haben und sie double als kompatibles Delegiertenobjekt automatisch (stellen Sie nur sicher, dass die Signatur übereinstimmt) wie in:

Console.CancelKeyPress +=
    (sender, e) => {
        Console.WriteLine("CTRL+C detected!\n");
        e.Cancel = true;
    };

Beachten Sie, dass ich keine new CancellationEventHandler noch muss ich die Arten von sender y e sind sie aus dem Ereignis ableitbar. Deshalb ist dies weniger umständlich als das Schreiben der gesamten delegate (blah blah) die ebenfalls die Angabe von Parametertypen erfordert.

Lambdas müssen nichts zurückgeben und die Typinferenz ist in einem solchen Kontext extrem leistungsfähig.

Und übrigens: Sie können jederzeit zurückkehren Lambdas, die Lambdas machen im Sinne der funktionalen Programmierung. Hier ist zum Beispiel ein Lambda, das ein Lambda erzeugt, das ein Button.Click-Ereignis verarbeitet:

Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };

btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);

Beachten Sie die Verkettung: (dx, dy) => (sender, e) =>

Deshalb bin ich froh, dass ich den Kurs über funktionale Programmierung belegt habe :-)

Neben den Zeigern in C ist das meiner Meinung nach die zweite grundlegende Sache, die man lernen sollte :-)

527voto

jfs Punkte 16666

Desde Rick Strahl :

Sie können den Operator ?? verketten, so dass Sie eine Reihe von Null-Vergleichen durchführen können.

string result = value1 ?? value2 ?? value3 ?? String.Empty;

453voto

BlackTigerX Punkte 5824

Aliierte Generika:

using ASimpleName = Dictionary<string, Dictionary<string, List<string>>>;

Es ermöglicht Ihnen die Verwendung ASimpleName anstelle von Dictionary<string, Dictionary<string, List<string>>> .

Verwenden Sie es, wenn Sie an vielen Stellen dasselbe große, lange, komplexe Ding verwenden würden.

437voto

jfs Punkte 16666

Desde CLR über C# :

Bei der Normalisierung von Zeichenketten ist es sehr empfohlen, dass Sie ToUpperInvariant anstelle von ToLowerInvariant zu verwenden, da Microsoft hat den Code für die Durchführung von Vergleiche in Großbuchstaben .

Ich erinnere mich, dass mein Kollege einmal Zeichenketten vor dem Vergleich immer in Großbuchstaben änderte. Ich habe mich immer gefragt, warum er das tut, denn ich finde es "natürlicher", zuerst in Kleinbuchstaben zu konvertieren. Nach der Lektüre des Buches weiß ich jetzt, warum.

254 Stimmen

Wenn Sie eine Zeichenkette in Großbuchstaben umwandeln, erstellen Sie ein zweites temporäres Zeichenkettenobjekt. Ich dachte, dass diese Art von Vergleich nicht bevorzugt wurde, dass der beste Weg war: String.Equals(stringA, stringB, StringComparison.CurrentCultureIgnoreCase), was diese Wegwerfzeichenkette überhaupt nicht erzeugt.

32 Stimmen

Welche Art von Optimierung können Sie beim Vergleich von Zeichenketten mit Großbuchstaben durchführen, die bei Zeichenketten mit Kleinbuchstaben nicht möglich ist? Ich verstehe nicht, warum das eine optimaler sein sollte als das andere.

1 Stimmen

Ich habe einen kurzen Test durchgeführt. Verglich "XXX" mit "XxX" 1 Million Mal, auf drei Arten (keine Konvertierung, invariant und string.Equals). Hier sind die Ergebnisse: No Match Test: Erzielt 0 Übereinstimmungen in 1 ms Invariant Match Test: Erzielt 100000 Treffer in 23 ms string.Equals Match Test: Erzielt 100000 Treffer in 8 ms

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