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.

10voto

TextInfo textInfo = Thread.CurrentThread.CurrentCulture.TextInfo;

textInfo.ToTitleCase("hello world!"); //Returns "Hello World!"
textInfo.ToTitleCase("hElLo WoRld!"); //Returns "Hello World!"
textInfo.ToTitleCase("Hello World!"); //Returns "Hello World!"
textInfo.ToTitleCase("HELLO WORLD!"); //Returns "HELLO WORLD!"

Ja, dieses Verhalten ist dokumentiert, aber das macht es noch lange nicht richtig.

9voto

Jon B Punkte 49459

MemoryStream.GetBuffer() gegen MemoryStream.ToArray() . Ersteres gibt den gesamten Puffer zurück, letzteres nur den verwendeten Teil. Igitt.

8voto

Benjol Punkte 60397

Dictionary<,>: "Die Reihenfolge, in der die Elemente zurückgegeben werden, ist undefiniert". Das ist furchtbar, weil es sich manchmal auswirkt, manchmal aber auch nicht, und wenn man einfach blind davon ausgeht, dass Dictionary sich gut verhält ("warum auch nicht? Ich dachte, List tut es"), muss man sich wirklich an die eigene Nase fassen, bevor man endlich anfängt, seine Annahme zu hinterfragen.

(Ähnliche Frage aquí .)

8voto

Boris Lipschitz Punkte 8746

Statische Konstruktoren werden unter Sperre ausgeführt. Infolgedessen kann der Aufruf von Threading-Code aus einem statischen Konstruktor zu einer Blockierung führen. Hier ist ein Beispiel, das dies veranschaulicht:

using System.Threading;
class Blah
{
    static void Main() { /* Won’t run because the static constructor deadlocks. */ }

    static Blah()
    {
        Thread thread = new Thread(ThreadBody);
        thread.Start();
        thread.Join();
    }

    static void ThreadBody() { }
}

8voto

MikeJ Punkte 14301

Es gibt ein ganzes Buch über .NET-Fehler

Mein Favorit ist der, bei dem man eine Klasse in C# erstellt, sie an VB vererbt und dann versucht, sie wieder an C# zu vererben, und es funktioniert nicht. ARGGH

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