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.

31voto

Verwendung von Standardparametern bei virtuellen Methoden

abstract class Base
{
    public virtual void foo(string s = "base") { Console.WriteLine("base " + s); }
}

class Derived : Base
{
    public override void foo(string s = "derived") { Console.WriteLine("derived " + s); }
}

...

Base b = new Derived();
b.foo();

Sortie :
abgeleitete Basis

28voto

Bjarke Ebert Punkte 1828

Wertobjekte in veränderlichen Sammlungen

struct Point { ... }
List<Point> mypoints = ...;

mypoints[i].x = 10;

hat keine Wirkung.

mypoints[i] gibt eine Kopie eines Point Wertobjekt. C# lässt Sie fröhlich ein Feld der Kopie ändern. Stillschweigend nichts tun.


Aktualisierung: Dies scheint in C# 3.0 behoben zu sein:

Cannot modify the return value of 'System.Collections.Generic.List<Foo>.this[int]' because it is not a variable

26voto

Vielleicht nicht das Schlimmste, aber einige Teile des .net-Frameworks Grad verwenden während andere Radiant (und die Dokumentation, die mit Intellisense erscheint, sagt Ihnen nie welche, Sie müssen MSDN besuchen, um es herauszufinden)

All dies hätte vermieden werden können, wenn ein Angle Klasse stattdessen...

22voto

Matt Davis Punkte 44077

Für C/C++-Programmierer ist der Übergang zu C# eine Selbstverständlichkeit. Das größte Problem, auf das ich persönlich gestoßen bin (und das ich auch bei anderen gesehen habe, die denselben Übergang vollzogen haben), ist jedoch, dass ich den Unterschied zwischen Klassen und Strukturen in C# nicht ganz verstehe.

In C++ sind Klassen und Strukturen identisch; sie unterscheiden sich nur in der Standardsichtbarkeit, wobei Klassen standardmäßig privat und Strukturen standardmäßig öffentlich sichtbar sind. In C++ ist diese Klassendefinition

    class A
    {
    public:
        int i;
    };

ist funktional äquivalent zu dieser struct-Definition.

    struct A
    {
        int i;
    };

In C# sind Klassen jedoch Referenztypen, während Structs Werttypen sind. Dies macht eine BIG Unterschied bei (1) der Entscheidung, wann das eine und wann das andere zu verwenden ist, (2) der Prüfung der Objektgleichheit, (3) der Leistung (z. B. Boxing/Unboxing) usw.

Im Internet finden sich zahlreiche Informationen über die Unterschiede zwischen den beiden Systemen (z. B., aquí ). Ich würde jedem, der auf C# umsteigt, empfehlen, sich zumindest mit den Unterschieden und ihren Auswirkungen vertraut zu machen.

19voto

Stefan Steinegger Punkte 62197

Arrays implementieren IList

Aber setzen Sie es nicht um. Wenn Sie Add aufrufen, sagt es Ihnen, dass es nicht funktioniert. Warum also implementiert eine Klasse eine Schnittstelle, wenn sie sie nicht unterstützen kann?

Kompiliert, funktioniert aber nicht:

IList<int> myList = new int[] { 1, 2, 4 };
myList.Add(5);

Wir haben dieses Problem häufig, weil der Serialisierer (WCF) alle IListen in Arrays umwandelt und wir Laufzeitfehler erhalten.

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