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

254voto

Eric Minkes Punkte 1391

Das Schlüsselwort "default" in generischen Typen:

T t = default(T);

ergibt 'null', wenn T ein Referenztyp ist, und 0, wenn es ein int ist, false, wenn es ein boolean ist, und so weiter.

4 Stimmen

Plus: type? als Abkürzung für Nullable<type>. default(int) == 0, aber default(int?) == null.

225voto

Stu Punkte 15215

Attribute im Allgemeinen, aber vor allem DebuggerDisplay . Das spart Ihnen Jahre.

9 Stimmen

Verwendung des DebuggerDisplay-Attributs (MSDN): msdn.microsoft.com/de-us/library/x810d419.aspx

220voto

lomaxx Punkte 108937

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

Wollte nur dieses eine zu klären... es nicht sagen, es zu ignorieren, die Escape-Zeichen, es tatsächlich sagt der Compiler, die Zeichenfolge als ein Literal zu interpretieren.

Wenn Sie eine

string s = @"cat
             dog
             fish"

ausgedruckt wird (beachten Sie, dass es sogar die Leerzeichen für die Einrückung enthält):

cat
             dog
             fish

0 Stimmen

Würde die Zeichenfolge nicht alle Leerzeichen enthalten, die Sie für die Einrückung verwendet haben?

18 Stimmen

Ja, das nennt man wortwörtliche Zeichenfolge.

4 Stimmen

Es wäre übersichtlicher, wenn die Ausgabe auch die Leerzeichen anzeigen würde, die ausgedruckt werden. Im Moment sieht es so aus, als ob die Zeichen der neuen Zeile gedruckt werden, aber die Leerzeichen ignoriert werden.

219voto

Jason Olson Punkte 3556

Ich denke, eine der am meisten unterschätzten und weniger bekannten Funktionen von C# (.NET 3.5) sind Ausdrucksbäume , insbesondere in Kombination mit Generika und Lambdas. Dies ist ein Ansatz zur API-Erstellung, den neuere Bibliotheken wie NInject und Moq verwenden.

Nehmen wir zum Beispiel an, ich möchte eine Methode bei einer API registrieren und diese API muss den Namen der Methode erhalten

Angesichts dieser Klasse:

public class MyClass
{
     public void SomeMethod() { /* Do Something */ }
}

Früher war es sehr üblich, dass Entwickler dies mit Strings und Typen (oder etwas anderem, das weitgehend auf Strings basiert) taten:

RegisterMethod(typeof(MyClass), "SomeMethod");

Nun, das ist scheiße, weil es keine starke Schreibweise gibt. Was, wenn ich "SomeMethod" umbenenne? Jetzt, in 3.5, kann ich dies jedoch in einer stark typisierten Weise tun:

RegisterMethod<MyClass>(cl => cl.SomeMethod());

Die Klasse RegisterMethod verwendet Expression<Action<T>> wie diese:

void RegisterMethod<T>(Expression<Action<T>> action) where T : class
{
    var expression = (action.Body as MethodCallExpression);

    if (expression != null)
    {
        // TODO: Register method
        Console.WriteLine(expression.Method.Name);
    }
}

Das ist ein wichtiger Grund, warum ich Lambdas und Expression Trees gerade jetzt so liebe.

3 Stimmen

Ich habe eine Reflection-Utility-Klasse, die dasselbe mit FieldInfo, PropertyInfo usw. tut.

0 Stimmen

Ja, das ist großartig. Ich konnte Methoden wie diese verwenden, um Code zu schreiben wie EditValue(someEmployee, e => e.FirstName); in meine Geschäftslogik einbauen und automatisch die gesamte Logik für ein ViewModel und eine View zum Bearbeiten dieser Eigenschaft generieren lassen (also ein Label mit dem Text "First Name" und eine TextBox mit einer Bindung, die den Setter der FirstName-Eigenschaft aufruft, wenn der Benutzer den Namen bearbeitet, und die View mithilfe des Getters aktualisiert). Dies scheint die Grundlage für die meisten der neuen internen DSLs in C# zu sein.

4 Stimmen

Ich denke, sie sind nicht so sehr weniger bekannt als vielmehr weniger verstanden.

208voto

Michael Stum Punkte 172055

" Ertrag "würde mir in den Sinn kommen. Einige der Attribute wie [DefaultValue()] gehören ebenfalls zu meinen Favoriten.

Die " var "-Schlüsselwort etwas bekannter ist, aber dass Sie es auch in .NET 2.0-Anwendungen verwenden können (solange Sie den .NET 3.5 Compiler verwenden und ihn auf die Ausgabe von 2.0-Code einstellen), scheint nicht sehr bekannt zu sein.

Edit: kokos, danke für den Hinweis auf den ?? Operator, das ist in der Tat sehr nützlich. Da es ein bisschen schwierig ist, danach zu googeln (da ?? einfach ignoriert wird), hier ist die MSDN-Dokumentationsseite für diesen Operator: ?? Operator (C#-Referenz)

14 Stimmen

In der Dokumentation des Standardwerts heißt es, dass er nicht wirklich den Wert der Eigenschaft festlegt. Er ist nur ein Hilfsmittel für Visualisierer und Codegeneratoren.

2 Stimmen

Was den DefaultValue betrifft: In der Zwischenzeit verwenden es einige Bibliotheken. ASP.net MVC verwendet DefaultValue für Parameter einer Controller-Aktion (was sehr nützlich für nicht-nullbare Typen ist). Streng genommen ist dies natürlich ein Code-Generator, da der Wert nicht vom Compiler, sondern vom MVC-Code gesetzt wird.

6 Stimmen

Die Bezeichnung für den Operator ?? lautet "Null Coalescing"-Operator

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