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.

7voto

Will Vousden Punkte 31058

En base Schlüsselwort funktioniert nicht wie erwartet, wenn es in einer Debugging-Umgebung ausgewertet wird: Der Methodenaufruf verwendet immer noch virtuelles Dispatch.

Das hat mich viel Zeit gekostet, als ich darüber gestolpert bin, und ich dachte, ich wäre auf eine Art Riss in der Raumzeit der CLR gestoßen, aber dann habe ich gemerkt, dass es ein bekannter (und sogar irgendwie beabsichtigter) Fehler ist:

http://blogs.msdn.com/jmstall/archive/2006/06/29/funceval-does-virtual-dispatch.aspx

7voto

En DesignMode Eigenschaft in allen UserControls bewirkt Ihnen nicht wirklich sagen wenn Sie sich im Entwurfsmodus befinden.

6voto

Shaul Behr Punkte 35201

ASP.NET:

Wenn Sie Linq-To-SQL verwenden, rufen Sie SubmitChanges() auf den Datenkontext und es kommt zu einer Ausnahme (z.B. doppelter Schlüssel oder eine andere Einschränkungsverletzung), verbleiben die fehlerhaften Objektwerte während der Fehlersuche in Ihrem Speicher und werden jedes Mal erneut übertragen, wenn Sie anschließend SubmitChanges() .

Und hier ist die real Der Clou: Die schlechten Werte bleiben im Speicher. auch wenn Sie in Ihrer IDE die Schaltfläche "Stopp" drücken und neu starten! Ich verstehe nicht, warum irgendjemand dies für eine gute Idee hielt - aber das kleine ASP.NET-Symbol, das in der Taskleiste auftaucht, läuft weiter und scheint Ihren Objekt-Cache zu speichern. Wenn Sie Ihren Speicherplatz leeren wollen, müssen Sie mit der rechten Maustaste auf das Symbol klicken und es zwangsweise abschalten! GOTCHA!

6voto

cciotti Punkte 730

Wenn Sie für MOSS kodieren und auf diese Weise einen Standortverweis erhalten:

SPSite oSiteCollection = SPContext.Current.Site;

und später in Ihrem Code sagen Sie:

oSiteCollection.Dispose();

En エムエスディーエヌ :

Wenn Sie ein SPSite-Objekt erstellen, können Sie die Methode Dispose verwenden, um das Objekt zu schließen. Wenn Sie jedoch einen Verweis auf eine gemeinsam genutzte Ressource haben, z. B. wenn das Objekt von der GetContextSite-Methode oder der Site-Eigenschaft (z. B. SPContext.Current.Site) bereitgestellt wird, verwenden Sie nicht die Dispose-Methode, um das Objekt zu schließen, sondern erlauben Sie den Windows SharePoint Services oder Ihrer Portalanwendung, das Objekt zu verwalten. Weitere Informationen zur Objektentsorgung finden Sie unter Best Practices: Verwendung von Einwegobjekten der Windows SharePoint Services.

Das passiert jedem MOSS-Programmierer irgendwann einmal.

5voto

Roboblob Punkte 1781

Sehen Sie sich das hier an:

class Program
{
    static void Main(string[] args)
    {
        var originalNumbers = new List<int> { 1, 2, 3, 4, 5, 6 };

        var list = new List<int>(originalNumbers);
        var collection = new Collection<int>(originalNumbers);

        originalNumbers.RemoveAt(0);

        DisplayItems(list, "List items: ");
        DisplayItems(collection, "Collection items: ");

        Console.ReadLine();
    }

    private static void DisplayItems(IEnumerable<int> items, string title)
    {
        Console.WriteLine(title);
        foreach (var item in items)
            Console.Write(item);
        Console.WriteLine();
    }
}

Und die Ausgabe ist:

List items: 123456
Collection items: 23456

Der Konstruktor für Sammlungen, der IList akzeptiert, erstellt einen Wrapper um die ursprüngliche Liste, während der Konstruktor für Listen eine neue Liste erstellt und alle Verweise vom Original in die neue Liste kopiert.

Sehen Sie hier mehr: http://blog.roboblob.com/2012/09/19/dot-net-gotcha-nr1-list-versus-collection-constructor/

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