Welchen Effekt hat das Schlüsselwort "new" in C # und warum ist es nur eine Warnung, wenn es nicht verwendet wird?

7

Betrachten Sie den folgenden Code:

%Vor%

Dies wird die folgende Warnung erzeugen:

  

'Test2.Data' verbirgt das geerbte Mitglied 'Test1.Data'. Verwenden Sie das neue Schlüsselwort, wenn das Verstecken beabsichtigt war.

Warum ist das nur eine Warnung und welche Auswirkung hat das Hinzufügen des "neuen" Schlüsselworts?

Nach meinen Tests kann ich keinen Unterschied mehr finden, wenn das "neue" Schlüsselwort hinzugefügt wird.

Versteh mich nicht falsch, ich bin dafür, dass du explizit bist, aber ich war neugierig auf den Vorteil, "neu" hinzuzufügen.

Meine einzigen Gedanken darüber, was es sein könnte, sind:

  • Verbesserte menschliche Lesbarkeit
  • Einige Speicherungen zur Laufzeit, wenn der Compiler nicht in der Lage ist, das Unvermeidliche aus dem langen Weg herauszufinden
joshcomley 10.08.2009, 13:37
quelle

4 Antworten

21

Der einzige Effekt, den das new -Schlüsselwort hat, ist das Entfernen der Warnung. Der Zweck, die Warnung zu erhalten, wenn das Schlüsselwort new nicht verwendet wird, besteht darin, zu verhindern, dass Sie die Methode versehentlich überschatten, wenn Sie wirklich beabsichtigen, sie zu überschreiben.

    
sepp2k 10.08.2009, 13:41
quelle
3

new wird verwendet, um eine Methode oder Eigenschaft der Basisklasse auszublenden. Dies ist nicht wie das Überschreiben: Das Member muss nicht die gleiche Signatur wie das Member der versteckten Basisklasse haben und ist nicht am Polymorphismus beteiligt.

Ein Beispiel:

%Vor%     
Thomas Levesque 10.08.2009 13:48
quelle
2

Aktivieren Sie Berichtswarnungen als Fehler. Dadurch werden Sie gezwungenermaßen expliziter, wenn Sie new und override verwenden.

    
DanDan 10.08.2009 13:45
quelle
1

Ob eine abgeleitete Klassenmethode als Überschreibung für eine Basisklassenmethode mit demselben Namen betrachtet werden sollte, hängt häufig davon ab, ob der Autor der abgeleiteten Klassenmethode von der Basisklassenmethode und dem damit verbundenen Vertrag Kenntnis hatte und hat die derived-class-Methode geschrieben, um diesen Vertrag zu erfüllen. In den meisten Fällen, in denen eine Methode der abgeleiteten Klasse denselben Namen und dieselbe Signatur wie eine Basisklassenmethode hat, würde die Methode der abgeleiteten Klasse den Basisklassenvertrag erfüllen, wenn der Autor einer implementierten Basisklasse jedoch einen Namen hinzufügt ohne zu realisieren, dass derselbe Name für einen anderen Zweck in einer abgeleiteten Klasse verwendet wird, kann nicht davon ausgegangen werden, dass der Autor der abgeleiteten Klassenmethode seine Methode so geschrieben hat, dass sie dem Vertrag für eine Basisklassenmethode entspricht, die zu diesem Zeitpunkt nicht existierte .

Es gibt keine allgemeinen Mittel, mit denen das C # feststellen kann, wann verschiedene Methoden zu Klassen hinzugefügt wurden, und daher kann der Compiler nicht wissen, ob der Autor einer Methode der abgeleiteten Klasse etwas über die Existenz eines Gleichgenannten wusste Basisklassenmethode es sei denn der Autor der abgeleiteten Klassenmethode gibt dem Compiler ausdrücklich an, ob er die Existenz der Basisklassenmethode kennt oder nicht, indem er die Modifikatoren new oder override verwendet.

Ich würde vorschlagen, die Modifikatoren (oder deren Fehlen) wie folgt zu interpretieren:

  • Keine - Der Autor ist sich der Existenz einer Basisklassenmethode nicht bewusst, und daher kann nicht erwarten, seinen Vertrag zu erfüllen.

  • new - Der Autor kennt die Methode der Basisklasse und hat diese Methode aus irgendeinem Grund geschrieben, um sie nicht zu erfüllen.

  • override - Der Autor kennt die Basisklassenmethode und ihren Vertrag und hat diese Methode geschrieben, um sie zu erfüllen.

Der Grund, warum der Compiler standardmäßig new annimmt, aber mit einer Warnung ist, dass in Fällen, in denen die Methode der abgeleiteten Klasse hinzugefügt wird, bevor die Basisklassenmethode jemals existiert hat, der Autor sich nicht bewusst sein kann der Basisvertrag und konnte nicht plausibel sein, einen Vertrag zu erfüllen, der noch nicht existierte, aber in Fällen, in denen die abgeleitete Klassenmethode nach der Basisklassenmethode geschrieben wird, sollte der Autor im Allgemeinen einen anderen Namen wählen, außer der Autor entweder beabsichtigt, den Basisvertrag zu erfüllen, oder einen bestimmten Grund, denselben Namen zu verwenden, ohne den Vertrag zu erfüllen. Der Compiler kann nicht feststellen, welche Methode zuerst geschrieben wurde und kann daher nicht wissen, welches Verhalten angemessen ist.

    
supercat 23.06.2015 21:58
quelle

Tags und Links