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

407voto

Mein Lieblingstrick ist die Verwendung der Null-Koaleszenz-Operator und Klammern, um automatisch Sammlungen für mich zu instanziieren.

private IList<Foo> _foo;

public IList<Foo> ListOfFoo 
    { get { return _foo ?? (_foo = new List<Foo>()); } }

3 Stimmen

Das ist eine coole Technik: die Einfügung der Zuweisung bei Null!

23 Stimmen

Fällt es Ihnen nicht schwer, das zu lesen?

72 Stimmen

Für Unerfahrene ist es etwas schwer zu lesen. Aber es ist kompakt und enthält eine Reihe von Mustern und Sprachfunktionen, die der Programmierer kennen und verstehen sollte. Auch wenn es anfangs schwer ist, bietet es den Vorteil, dass es ein Grund zum Lernen ist.

314voto

andynil Punkte 26978

Vermeiden Sie die Überprüfung auf Null-Ereignishandler

Das Hinzufügen eines leeren Delegaten zu Ereignissen bei der Deklaration, wodurch die Notwendigkeit, das Ereignis immer auf Null zu prüfen, bevor es aufgerufen wird, entfällt, ist großartig. Beispiel:

public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!

Lassen Sie sich das machen

public void DoSomething()
{
    Click(this, "foo");
}

Stattdessen

public void DoSomething()
{
    // Unnecessary!
    MyClickHandler click = Click;
    if (click != null) // Unnecessary! 
    {
        click(this, "foo");
    }
}

Bitte beachten Sie auch dies verwandte Diskussion und dies Blog-Eintrag von Eric Lippert zu diesem Thema (und möglichen Nachteilen).

0 Stimmen

Interessanter Tipp! Ich persönlich verwende die Hilfserweiterungsmethoden meines Projekts ( codeplex.com/thehelpertrinity ), um dies einfach zu tun: Click.Raise(this, "foo");

87 Stimmen

Ich glaube, dass ein Problem auftauchen wird, wenn Sie sich auf diese Technik verlassen und die Klasse serialisieren müssen. Sie werden das Ereignis eliminieren, und bei der Deserialisierung werden Sie eine NullRefference.... erhalten. Man kann also einfach bei der "alten Methode" bleiben, die Dinge zu tun. Das ist sicherer.

16 Stimmen

Können Sie immer noch Ihre Event-Handler auf Null, so dass Sie immer noch eine Null-Referenz zu erhalten, und Sie haben immer noch eine Race Condition.

304voto

Keith Punkte 141163

Alles andere, plus

1) implizite Generika (warum nur für Methoden und nicht für Klassen?)

void GenericMethod<T>( T input ) { ... }

//Infer type, so
GenericMethod<int>(23); //You don't need the <>.
GenericMethod(23);      //Is enough.

2) einfache Lambdas mit einem Parameter:

x => x.ToString() //simplify so many calls

3) anonyme Typen und Initialisierer:

//Duck-typed: works with any .Add method.
var colours = new Dictionary<string, string> {
    { "red", "#ff0000" },
    { "green", "#00ff00" },
    { "blue", "#0000ff" }
};

int[] arrayOfInt = { 1, 2, 3, 4, 5 };

Eine andere:

4) Auto-Eigenschaften können unterschiedliche Geltungsbereiche haben:

public int MyId { get; private set; }

Danke @pzycoman, dass du mich daran erinnert hast:

5) Namensraum-Aliase (nicht, dass Sie diese besondere Unterscheidung benötigen würden):

using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;

web::Control aWebControl = new web::Control();
win::Control aFormControl = new win::Control();

0 Stimmen

Ich habe tatsächlich benötigt, um die erste auf ein Projekt mit Anthem zu tun, weil es den WebControls-Namensraum vereitelt.

14 Stimmen

In Nr. 3 können Sie Enumerable.Range(1,5) verwenden

0 Stimmen

Ja, das kann man für dieses spezielle Beispiel, vielleicht war es schlecht gewählt. Sie können ein beliebiges Array auf diese Weise initiieren: int[] arrayOfInt = new { 4, 8, 15, 16, 23, 42 }

285voto

Mike Stone Punkte 43560

Ich kannte das Schlüsselwort "as" eine ganze Weile lang nicht.

MyClass myObject = (MyClass) obj;

gegen

MyClass myObject = obj as MyClass;

Die zweite gibt null zurück, wenn obj keine MyClass ist, anstatt eine Klassen-Cast-Ausnahme auszulösen.

42 Stimmen

Übertreiben Sie es aber nicht. Viele Leute scheinen as zu verwenden, weil sie die Syntax bevorzugen, obwohl sie die Semantik von (ToType)x wollen.

0 Stimmen

Ja, was in dieser Antwort angegeben ist, ist nur einer der Unterschiede zwischen (ToType) und "as ToType".

0 Stimmen

Das Schlüsselwort "as" bietet auch eine bessere Leistung :-)

261voto

lomaxx Punkte 108937

Zwei Dinge, die ich mag, sind automatische Eigenschaften, damit Sie Ihren Code noch weiter reduzieren können:

private string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

wird

public string Name { get; set;}

Auch Objektinitialisierungen:

Employee emp = new Employee();
emp.Name = "John Smith";
emp.StartDate = DateTime.Now();

wird

Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()}

0 Stimmen

Dadurch lassen sich die Klassen viel schneller schreiben.

6 Stimmen

Sollte es angemerkt werden, dass automatische Eigenschaften nur in C# 3.0 verfügbar sind?

0 Stimmen

Das Tolle daran ist, dass man "Prop" 2x[tab] eingibt und die Immobilie kostenlos erhält :)

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