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

72voto

jcruz Punkte 718

Hier ist eine neue Methode der String-Klasse in C# 4.0:

String.IsNullOrWhiteSpace(String value)

Es ist an der Zeit.

3 Stimmen

Was ist das Problem mit der Erstellung einer eigenen util-Methode, die dies zurückgibt: (myString ?? "").Trim() == ""

1 Stimmen

@Charlie Wird ein Wagenrücklauf nicht auch als Leerzeichen behandelt?

4 Stimmen

Ich bevorzuge definitiv Der Ansatz von Haack jetzt, wo ich es ausprobiert habe. Sie haben String-Erweiterungsmethoden für AsNullIfEmpty und AsNullIfWhiteSpace zusammengestellt. Auf diese Weise können Sie das Ergebnis dann in einem Koaleszenz-Operator verwenden: SomeString.AsNullIfEmpty() ?? "default value" .

70voto

Ich habe dieses Buch bei der Verwendung von ReSharper :

Implizite Methode Gruppenumwandlung

//If given this:
var myStrings = new List<string>(){"abc","def","xyz"};
//Then this:
myStrings.ForEach(s => Console.WriteLine(s));
//Is equivalent to this:
myStrings.ForEach(Console.WriteLine);

Siehe " Implizite Methodengruppen-Konvertierung in C# " für mehr.

0 Stimmen

Nicht für Debug.WriteLine, da es intern eine #if DEBUG-Anweisung verwendet.

0 Stimmen

@AndyC: Darum geht es hier nicht (ForEach ist einfach irgendwo als benutzerdefinierte Erweiterungsmethode definiert. Darüber gibt es an anderer Stelle religiöse Debatten :))

0 Stimmen

IMHO sieht das Folgende besser aus ----------------- foreach(string s in myString) Console.WriteLine(s);

68voto

JamesSugrue Punkte 14661
  • TransactionScope und AbhängigeTransaktion in System.Transactions ist eine leichtgewichtige Möglichkeit, die Transaktionsverarbeitung in .NET zu nutzen - sie ist nicht nur für Datenbanktransaktionen entweder
  • String.IsNullOrEmpty ist eine Funktion, von der ich überrascht bin, dass viele Entwickler sie nicht kennen
  • List.ForEach - durchlaufen Sie Ihre generische Liste mit einer Delegatenmethode

Es gibt noch mehr, aber das sind die drei offensichtlichsten, die mir gerade einfallen...

0 Stimmen

Ich habe festgestellt, dass TransactionScope die Transaktionen aggressiv in den verteilten Modus versetzt, der DTC verwendet. Wenn DTC ins Spiel kommt, müssen Sie sich wahrscheinlich mit der DCOM-Sicherheit auseinandersetzen. Ich neige dazu, diesen Schmerz zu vermeiden, indem ich native Transaktionen verwende.

17 Stimmen

Dass List.ForEach schneller ist als foreach oder for(;;), ist völlig verrückt. ForEach verwendet einen Methoden-/Funktionsdelegaten, um das Verhalten zu implementieren. Dies bedeutet erstens eine schlechtere Cache-Lokalität, da der Code im Allgemeinen weiter entfernt (im Speicher) von der eigentlichen Schleife ausgeführt wird. Zweitens müssen Sie sich nur den generierten nativen Code ansehen, um zu überprüfen, ob dies langsamer ist. In List.ForEach steckt viel mehr drin, als Sie vielleicht denken.

0 Stimmen

Völlig durchgeknallt? Nun, ich fand, dass .ForEach schneller ist als alle anderen Optionen. Siehe jerrytech.blogspot.com/2010/02/ wenn Sie an mir zweifeln. Zweifeln Sie immer an mir ;) Der Code ist da - führen Sie ihn selbst aus und sehen Sie nach.

68voto

Steve Dunn Punkte 19686

Beim Debuggen können Sie Folgendes eingeben $exception in der Uhr \QuickWatch\Immediate und erhalten alle Informationen mit Ausnahme des aktuellen Bildes. Dies ist sehr nützlich, wenn Sie 1st Chance Ausnahmen eingeschaltet haben!

66voto

Wyzfen Punkte 363

Dictionary.TryGetValue(K Schlüssel, out V Wert)

Funktioniert als Check und Get in einem. Eher als;

if(dictionary.ContainsKey(key)) 
{
    value = dictionary[key];
    ...
}

können Sie einfach tun;

if(dictionary.TryGetValue(key, out value)) 
{ ... }

und der Wert wurde festgelegt.

19 Stimmen

Ein weiterer Vorteil von TryGetValue ist, dass es keine Wettlaufbedingungen gibt, wenn Ihr Wörterbuch synchronisiert ist. Im Vergleich zu ContainsKey, wo ein anderer Thread das gesuchte Element zwischen den Aufrufen entfernen könnte.

4 Stimmen

TryGetValue löst aus, wenn der Schlüssel null ist - so viel zur Vermeidung von Axceptions. Ich verwende eine TryGetValue2()-Erweiterungsmethode, um dieses Problem zu umgehen.

3 Stimmen

Die Suche nach einer Null in einem Wörterbuch scheint eher ein Codefehler zu sein als die Suche nach einem nicht existierenden Wert. Ich persönlich bin froh, dass es die Ausnahme auslöst ;)

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