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

94voto

Ralph Caraveo Punkte 9667

Vielen Menschen ist nicht klar, dass sie Saiten vergleichen können: OrdinalIgnoreCase vergleichen können, anstatt someString.ToUpper() zu verwenden. Dadurch entfällt der zusätzliche Overhead bei der Stringzuweisung.

if( myString.ToUpper() == theirString.ToUpper() ){ ... }

wird

if( myString.Equals( theirString, StringComparison.OrdinalIgnoreCase ) ){ ... }

39 Stimmen

Dies könnte ganz einfach geändert werden, um auch null-sicher zu sein: var isEqual = String.Equals(a, b, StringComparison.OrdinalIgnoreCase);

0 Stimmen

Aber... das ist kein C#-Feature, es ist ein Feature des .Net-Frameworks, genauer gesagt ein Feature der Klasse "String".

79voto

Cristian Libardo Punkte 9235

Gerade gelernt, anonyme Typen können Eigenschaftsnamen aus dem Variablennamen ableiten:

string hello = "world";
var o = new { hello };
Console.WriteLine(o.hello);

0 Stimmen

Dies liegt daran, dass anonyme Typen nach der Kompilierung nicht mehr anonym sind.

75voto

ljs Punkte 35909

Ich mag es, Dinge in einer Liste nachzuschlagen, wie zum Beispiel:-

bool basketContainsFruit(string fruit) {
  return new[] { "apple", "orange", "banana", "pear" }.Contains(fruit);
}

Anstatt:-

bool basketContainsFruit(string fruit) {
  return fruit == "apple" || fruit == "orange" || fruit == "banana" ||
    fruit == "pear";
}

In der Praxis kommt das nicht so oft vor, aber die Idee, Elemente mit dem Thema der Suche abzugleichen, kann wirklich sehr nützlich und prägnant sein.

0 Stimmen

Ich bin gespannt, was der Compiler für beide Implementierungen ausspuckt. Die erste sieht auf jeden Fall sauberer aus und ist eine nette Art und Weise zu tun. Könnte aber langsamer sein, wenn das Objekt tatsächlich im Speicher zuerst erstellt und dann durch iteriert wird.

0 Stimmen

Sie wollten wahrscheinlich Obst == Banane?

0 Stimmen

Ziemlich cool. Aber ich würde es optimieren, um ein statisches Array zu verwenden, damit es nicht jedes Mal, wenn die Methode aufgerufen wird, neu erstellt wird.

75voto

Nick Berardi Punkte 53415

Ehrlich gesagt sollten die Experten per definitionem mit diesen Dingen vertraut sein. Aber um Ihre Frage zu beantworten: Tabelle der eingebauten Typen (C#-Referenz)

Die Compiler-Flags für Zahlen sind für diese weithin bekannt:

Decimal = M
Float = F
Double = D

// for example
double d = 30D;

Diese sind jedoch eher undurchsichtig:

Long = L
Unsigned Long = UL
Unsigned Int = U

4 Stimmen

Jedes Mal, wenn ich mit Dezimalzahlen zu tun habe, muss ich das m nachschlagen. Geht es nur mir so oder ist m nicht wirklich intuitiv :)

47 Stimmen

Die M-Syntax stammt von dem alten VB-Typ namens Money. M == Money == Decimal.

3 Stimmen

Nein, alles, was weniger als ein Int32 ist, wird vom Compiler automatisch aus dem Typ links davon abgeleitet

73voto

DAC Punkte 1749

InternalsVisibleTo ist ein Attribut, das nicht so bekannt ist, aber unter bestimmten Umständen sehr nützlich sein kann. Es ermöglicht im Grunde einer anderen Assembly den Zugriff auf "interne" Elemente der definierenden Assembly.

12 Stimmen

Ich verwende dies regelmäßig zum Schreiben von Unit-Tests gegen interne Mitglieder einer anderen Assembly. Auf diese Weise können Unit-Tests von Implementierungen ausgeschlossen werden.

0 Stimmen

Dies ist definitiv meine beste Entdeckung zu diesem Thema. Die beste Lösung, die ich selbst gefunden hatte, um Unit-Tests in einer anderen Assembly Zugriff auf interne Methoden zu geben, bestand darin, die Methoden geschützt zu machen und Pseudo-Mock-Klassen in meiner Test-Assembly zu schreiben, die von der zu testenden Klasse geerbt haben.

0 Stimmen

InternalsVisibleTo ist sehr nützlich, um einen geschützten internen parameterlosen .ctor einer NHibernate-Schicht zugänglich zu machen und ihn gleichzeitig vor einer Benutzeranwendung zu verbergen, die dann nur den öffentlichen .ctor verwenden kann, der die Bereitstellung der erforderlichen Daten erzwingt.

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