8 Stimmen

Ist das Anlegen von Objekten veraltet?

Ok, hier ist die Frage... ist das neue Schlüsselwort obsolet?

Betrachte in C# (und Java, glaube ich) gibt es strenge Regeln für Typen. Klassen sind Referenztypen und können nur auf dem Heap erstellt werden. POD-Typen werden auf dem Stack erstellt; wenn Sie sie auf dem Heap zuweisen möchten, müssen Sie sie in einem Objekttyp boxen. In C# sind structs die Ausnahme, sie können auf dem Stack oder dem Heap erstellt werden.

Angesichts dieser Regeln, ergibt es Sinn, dass wir immer noch das neue Schlüsselwort verwenden müssen? Würde es nicht sinnvoll sein, dass die Sprache die richtige Allokationsstrategie basierend auf dem Typ verwendet?

Zum Beispiel, müssen wir derzeit schreiben:

SomeClassType x = new SomeClassType();

anstatt

SomeClassType x = SomeClassType();

oder auch nur

SomeClassType x;

Der Compiler würde, basierend darauf, dass der erstellte Typ ein Referenztyp ist, den Speicher für x auf dem Heap allozieren.

Dies gilt für andere Sprachen wie Ruby, PHP, et al. C/C++ erlauben dem Programmierer mehr Kontrolle darüber, wo Objekte erstellt werden, daher hat es guten Grund, das neue Schlüsselwort zu erfordern.

Ist new nur ein Überbleibsel aus den 60er Jahren und unserem C-basierten Erbe?

2voto

Daniel Earwicker Punkte 111630

Würde es nicht Sinn machen für die Sprache, die richtige Zuweisungsstrategie basierend auf dem Typ zu verwenden?

Das ist genau das, was der C# Compiler/Runtime bereits tut. Das new Schlüsselwort ist nur die Syntax, um ein Objekt in einer Weise zu konstruieren, die für dieses Objekt sinnvoll ist.

Das Entfernen des new Schlüsselworts würde weniger offensichtlich machen, dass ein Konstruktor aufgerufen wird. Für ein ähnliches Beispiel, betrachten Sie out Parameter:

myDictionary.TryGetValue(key, out val);

Der Compiler weiß bereits, dass val ein out ist. Wenn Sie es nicht angeben, beschwert er sich. Aber es macht den Code lesbarer, es auszusagen.

Zumindest ist das die Rechtfertigung - in modernen IDEs könnten diese Dinge auf andere Weise gefunden und hervorgehoben werden, abgesehen vom tatsächlich eingefügten Text.

Ist new nur ein Überbleibsel aus den 60ern und unserem C-basierten Erbe?

Auf keinen Fall. C hat kein new Schlüsselwort.

1voto

OscarRyz Punkte 189898

Ich programmiere seit mehreren Jahren mit Java und es ist mir egal, ob mein Objekt auf dem Heap oder auf dem Stack ist. Aus dieser Perspektive ist es mir egal, ob ich new eingebe oder nicht.

Ich denke, das wäre für andere Sprachen relevanter.

Das Einzige, worauf ich achte, ist, dass die Klasse die richtigen Operationen hat und meine Objekte ordnungsgemäß erstellt werden.

Übrigens benutze ich (oder versuche), das Schlüsselwort new nur in der Factory-Methode zu verwenden, sodass mein Client so oder so aussieht

SomeClasType x = SomeClasType.newInstance();

Siehe: Effektives Java-Element:1

0voto

Austin Salonen Punkte 47404

Wenn Sie keinen parameterlosen Konstruktor haben, könnte das hässlich werden.

Wenn Sie mehrere Konstruktoren haben, könnte das wirklich hässlich werden.

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