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

197voto

Brad Barker Punkte 2074

Ich habe die Erfahrung gemacht, dass die meisten C#-Entwickler nichts über "nullable" Typen wissen. Im Grunde genommen, Primitive, die einen Null-Wert haben können.

double? num1 = null; 
double num2 = num1 ?? -100;

Setzt einen löschbaren Double, num1 auf Null setzen, dann ein reguläres Double setzen, num2 zu num1 o -100 wenn num1 war null.

http://msdn.microsoft.com/en-us/library/1t3y8s4s(VS.80).aspx

eine weitere Sache über Nullable Typ:

DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();

wird String.Empty zurückgegeben. Prüfen Sie diese Link für weitere Einzelheiten

0 Stimmen

Worin besteht der Unterschied zwischen dieser Vorgehensweise und der Verwendung der Wrapper-Objekte für Primäre?

0 Stimmen

Einige Typen sind normalerweise löschbar, wie DateTime. DateTime? ist also ein Geschenk des Himmels

1 Stimmen

DateTime kann nicht auf Null gesetzt werden.

192voto

Hier sind einige interessante versteckte C#-Funktionen, in Form von undokumentierten C#-Schlüsselwörtern:

__makeref

__reftype

__refvalue

__arglist

Dies sind undokumentierte C#-Schlüsselwörter (sogar Visual Studio erkennt sie!), die für ein effizienteres Boxing/Unboxing vor den Generics hinzugefügt wurden. Sie arbeiten in Koordination mit der System.TypedReference-Struktur.

Außerdem gibt es __arglist, das für Parameterlisten variabler Länge verwendet wird.

Eine Sache, über die die Leute nicht viel wissen, ist System.WeakReference -- eine sehr nützliche Klasse, die den Überblick über ein Objekt behält, aber dennoch dem Garbage Collector erlaubt, es einzusammeln.

Die nützlichste "versteckte" Funktion ist das Schlüsselwort yield return. Es ist nicht wirklich versteckt, aber viele Leute wissen es nicht. LINQ baut darauf auf; es ermöglicht verzögerte Abfragen, indem es einen Zustandsautomaten unter der Haube erzeugt. Raymond Chen hat kürzlich einen Beitrag über die interne, grobe Details .

2 Stimmen

Weitere Einzelheiten zu den undokumentierten Schlüsselwörtern von Peter Bromberg . Ich verstehe immer noch nicht, ob es Gründe gibt, sie überhaupt zu benutzen.

0 Stimmen

@HuBeZa mit dem Aufkommen der Generika, gibt es nicht viele (alle?) gute Gründe zu __refType, __makeref und __refvalue verwendet. Diese wurden in erster Linie verwendet, um Boxing vor den Generics in .NET 2 zu vermeiden.

0 Stimmen

Matt, mit der Einführung von Generics in .NET 2 gibt es wenig Grund, diese Schlüsselwörter zu verwenden, da ihr Zweck war, Boxing beim Umgang mit Werttypen zu vermeiden. Siehe den Link von HuBeZa, und siehe auch codeproject.com/Artikel/38695/UnCommon-C-keywords-A-Look#ud

184voto

ZeroBugBounce Punkte 3602

Unions (die Art von gemeinsamem Speicher in C++) in reinem, sicherem C#

Ohne auf den unsicheren Modus und Zeiger zurückzugreifen, können Sie Klassenmitglieder den Speicherplatz in einer Klasse/Struktur gemeinsam nutzen lassen. Gegeben sei die folgende Klasse:

[StructLayout(LayoutKind.Explicit)]
public class A
{
    [FieldOffset(0)]
    public byte One;

    [FieldOffset(1)]
    public byte Two;

    [FieldOffset(2)]
    public byte Three;

    [FieldOffset(3)]
    public byte Four;

    [FieldOffset(0)]
    public int Int32;
}

Sie können die Werte der Byte-Felder ändern, indem Sie das Int32-Feld manipulieren und umgekehrt. Zum Beispiel, dieses Programm:

    static void Main(string[] args)
    {
        A a = new A { Int32 = int.MaxValue };

        Console.WriteLine(a.Int32);
        Console.WriteLine("{0:X} {1:X} {2:X} {3:X}", a.One, a.Two, a.Three, a.Four);

        a.Four = 0;
        a.Three = 0;
        Console.WriteLine(a.Int32);
    }

Dies wird ausgegeben:

2147483647
FF FF FF 7F
65535

einfach hinzufügen using System.Runtime.InteropServices;

7 Stimmen

@George, wirkt Wunder, wenn Sie mit Legacy-Anwendungen über Sockets unter Verwendung von C-Union-Deklarationen kommunizieren.

2 Stimmen

Es ist auch sinnvoll, int und float bei Offset 0 zu sagen. Das ist das, was man braucht, wenn man Fließkommazahlen als Bitmasken manipulieren will, was man manchmal tun möchte. Vor allem, wenn Sie neue Dinge über Fließkommazahlen lernen wollen.

2 Stimmen

Das Ärgerliche daran ist, dass der Compiler Sie zwingt, ALLE Variablen in der Init-Funktion zu setzen, wenn Sie diese als Struktur verwenden wollen. Wenn Sie also: public A(int int32) { Int32 = int32; } haben, wird die Meldung "Feld 'Eins' muss vollständig zugewiesen werden, bevor die Kontrolle an den Aufrufer zurückgegeben wird" ausgegeben, so dass Sie auch Eins = Zwei = Drei = Vier = 0; setzen müssen.

175voto

Mark Cidade Punkte 95914

Verwendung von @ für Variablennamen, die Schlüsselwörter sind.

var @object = new object();
var @string = "";
var @if = IpsoFacto();

38 Stimmen

Warum sollten Sie ein Schlüsselwort als Variablennamen verwenden? Mir scheint, dass dies den Code weniger lesbar und verworren machen würde.

41 Stimmen

Nun, der Grund dafür ist, dass CLI es für die Interoperabilität mit anderen Sprachen, die C#-Schlüsselwörter als Mitgliedsnamen verwenden, benötigt

0 Stimmen

Die Begründung von marxidad ist gut. Danach hat Carl Recht. Wenn ich einen Code pflegen müsste, bei dem jemand dies getan hat, kann ich nicht dafür verantwortlich gemacht werden, was passiert, wenn ich ihn das nächste Mal sehe! :)

167voto

Jan Bannister Punkte 4729

Wenn Sie Ihr Programm beenden wollen, ohne irgendwelche finally-Blöcke oder Finalizer aufzurufen, verwenden Sie FailFast :

Environment.FailFast()

12 Stimmen

Beachten Sie, dass diese Methode auch einen Speicherauszug erstellt und eine Meldung in das Windows-Fehlerprotokoll schreibt.

1 Stimmen

Es sollte beachtet werden, dass keine Finalizer oder App-Domain Unload-Ereignisse aufgerufen werden, wenn diese Methode verwendet wird...

1 Stimmen

+1 für den Hinweis, aber dies ist nicht C#, es ist BCL von .NET.

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