384 Stimmen

Was ist der schlimmste Fehler in C# oder .NET?

Ich habe kürzlich mit einem DateTime Objekt, und schrieb etwas wie dieses:

DateTime dt = DateTime.Now;
dt.AddDays(1);
return dt; // still today's date! WTF?

Die Intellisense-Dokumentation für AddDays() sagt, dass es einen Tag zum Datum hinzufügt, was nicht der Fall ist - es devuelve ein Datum mit einem hinzugefügten Tag, also müssen Sie es so schreiben:

DateTime dt = DateTime.Now;
dt = dt.AddDays(1);
return dt; // tomorrow's date

Dies hat mich schon einige Male gebissen, also dachte ich, es wäre nützlich, die schlimmsten C#-Fehler zu katalogisieren.

158 Stimmen

Return DateTime.Now.AddDays(1);

24 Stimmen

Soweit ich weiß, sind die eingebauten Werttypen alle unveränderlich, zumindest insofern, als jede Methode, die mit dem Typ verbunden ist, ein neues Element zurückgibt, anstatt das vorhandene Element zu verändern. Zumindest fällt mir spontan kein Typ ein, der dies nicht tut: alles schön und konsistent.

1 Stimmen

Community-Wiki, so viel Spam in SO jetzt. Wenn Fragen subjektiv sind (keine endgültige Antwort), sollte es Community Wiki sein.

46voto

Maltrap Punkte 2610

DateTime.ToString("tt/MM/jjjj") Dies wird tatsächlich no immer tt/MM/jjjj an, sondern berücksichtigt die regionalen Einstellungen und ersetzt das Datumstrennzeichen je nach Standort. Sie könnten also dd-MM-yyyy oder etwas Ähnliches erhalten.

Der richtige Weg, dies zu tun, ist die Verwendung von DateTime.ToString("dd'/'MM'/'yyyy");


DateTime.ToString("r") soll nach RFC1123 konvertieren, das GMT verwendet. Die GMT weicht nur um den Bruchteil einer Sekunde von der UTC ab, und dennoch ist der "r"-Formatspezifizierer wird nicht in UTC umgerechnet auch wenn die betreffende DateTime als Local angegeben ist.

Dies führt zu folgendem Problem (je nachdem, wie weit Ihre Ortszeit von UTC entfernt ist):

DateTime.Parse("Tue, 06 Sep 2011 16:35:12 GMT").ToString("r")
>              "Tue, 06 Sep 2011 17:35:12 GMT"

Hoppla!

45voto

Mitchel Sellers Punkte 60318

Ich habe neulich diesen Beitrag gesehen, und ich denke, er ist ziemlich obskur und schmerzhaft für diejenigen, die ihn nicht kennen

int x = 0;
x = x++;
return x;

Da dies 0 zurückgibt und nicht 1, wie die meisten erwarten würden

41voto

Damovisa Punkte 18793

Ich bin ein bisschen spät dran, aber ich habe zwei Probleme, die mich beide in letzter Zeit geplagt haben:

DateTime-Auflösung

Die Eigenschaft Ticks misst die Zeit in 10-Millionstel-Sekunden (100-Nanosekunden-Blöcke), die Auflösung beträgt jedoch nicht 100 Nanosekunden, sondern etwa 15 ms.

Dieser Code:

long now = DateTime.Now.Ticks;
for (int i = 0; i < 10; i++)
{
    System.Threading.Thread.Sleep(1);
    Console.WriteLine(DateTime.Now.Ticks - now);
}

gibt Ihnen eine Ausgabe von (zum Beispiel):

0
0
0
0
0
0
0
156254
156254
156254

Ähnlich verhält es sich mit DateTime.Now.Millisecond: Sie erhalten Werte in gerundeten Abschnitten von 15,625 ms: 15, 31, 46, usw.

Dieses besondere Verhalten variiert von System zu System aber es gibt noch weitere auflösungsbedingte Probleme in dieser Datum/Uhrzeit-API.


Pfad.Kombinieren

Eine großartige Möglichkeit, Dateipfade zu kombinieren, aber sie verhält sich nicht immer so, wie man es erwarten würde.

Beginnt der zweite Parameter mit einem \ Zeichen, wird es Ihnen keinen vollständigen Pfad geben:

Dieser Code:

string prefix1 = "C:\\MyFolder\\MySubFolder";
string prefix2 = "C:\\MyFolder\\MySubFolder\\";
string suffix1 = "log\\";
string suffix2 = "\\log\\";

Console.WriteLine(Path.Combine(prefix1, suffix1));
Console.WriteLine(Path.Combine(prefix1, suffix2));
Console.WriteLine(Path.Combine(prefix2, suffix1));
Console.WriteLine(Path.Combine(prefix2, suffix2));

Sie erhalten diese Ausgabe:

C:\MyFolder\MySubFolder\log\
\log\
C:\MyFolder\MySubFolder\log\
\log\

39voto

user25306 Punkte 411

Wenn Sie einen Prozess (unter Verwendung von System.Diagnostics) starten, der in die Konsole schreibt, Sie aber nie den Console.Out-Stream lesen, scheint Ihre Anwendung nach einer bestimmten Menge an Ausgaben zu hängen.

36voto

Shaul Behr Punkte 35201

Keine Operator-Kurzbefehle in Linq-To-Sql

Véase aquí .

Kurz gesagt, innerhalb der Bedingungsklausel einer Linq-To-Sql-Abfrage können Sie keine bedingten Abkürzungen verwenden wie || y && um Nullreferenz-Ausnahmen zu vermeiden; Linq-To-Sql wertet beide Seiten des OR- oder AND-Operators aus, auch wenn die erste Bedingung die Auswertung der zweiten Bedingung überflüssig macht!

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