Ich bemerkte , dass mit den optionalen Parameter in C # 4 , wenn Sie einen optionalen Parameter für eine Schnittstelle geben Sie don t haben , um diesen Parameter optional auf jeder implementierenden Klasse zu machen:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
und deshalb:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Weiß jemand, warum optionale Parameter so funktionieren?
Einerseits denke ich, dass die Möglichkeit, alle auf den Schnittstellen angegebenen Standardwerte zu überschreiben, nützlich ist. Um ehrlich zu sein, bin ich mir nicht sicher, ob Sie überhaupt Standardwerte auf der Schnittstelle angeben können sollten, da dies eine Implementierungsentscheidung sein sollte.
Andererseits bedeutet diese Trennung, dass Sie die konkrete Klasse und die Schnittstelle nicht immer austauschbar verwenden können. Dies wäre natürlich kein Problem, wenn der Standardwert in der Implementierung angegeben wird. Wenn Sie jedoch Ihre konkrete Klasse als Schnittstelle verfügbar machen (z. B. mithilfe eines IOC-Frameworks, um die konkrete Klasse einzufügen), gibt es wirklich keine Punkt mit dem Standardwert, da der Anrufer ihn trotzdem immer angeben muss.
MyInterface
und mit dem optionalen Parameter aufrufen :((MyInterface)obj).TestMethod();
.Antworten:
UPDATE: Diese Frage war das Thema meines Blogs am 12. Mai 2011. Danke für die tolle Frage!
Angenommen, Sie haben eine Schnittstelle, wie Sie sie beschreiben, und hundert Klassen, die sie implementieren. Dann entscheiden Sie sich, einen der Parameter einer der Methoden der Schnittstelle optional zu machen. Schlagen Sie vor, dass der Compiler den Entwickler zwingen muss, jede Implementierung dieser Schnittstellenmethode zu finden und den Parameter ebenfalls optional zu machen?
Angenommen, wir haben das getan. Angenommen, der Entwickler hatte nicht den Quellcode für die Implementierung:
Wie soll der Autor von D diese Arbeit machen? Müssen sie in Ihrer Welt den Autor von B am Telefon anrufen und sie bitten, ihnen eine neue Version von B zu senden, mit der die Methode einen optionalen Parameter hat?
Das wird nicht fliegen. Was ist, wenn zwei Personen den Autor von B anrufen und einer von ihnen möchte, dass die Standardeinstellung wahr ist, und einer von ihnen möchte, dass sie falsch ist? Was ist, wenn der Autor von B sich einfach weigert, mitzuspielen?
Vielleicht müssten sie in diesem Fall sagen:
Die vorgeschlagene Funktion scheint dem Programmierer eine Menge Unannehmlichkeiten zu bereiten, ohne dass die repräsentative Leistung entsprechend erhöht wird. Was ist der überzeugende Vorteil dieser Funktion, der die erhöhten Kosten für den Benutzer rechtfertigt?
UPDATE: In den Kommentaren unten schlägt supercat eine Sprachfunktion vor, die der Sprache wirklich mehr Leistung verleiht und einige Szenarien ermöglicht, die den in dieser Frage beschriebenen ähnlich sind. Zu Ihrer Information, diese Funktion - Standardimplementierungen von Methoden in Schnittstellen - wird zu C # 8 hinzugefügt.
quelle
Ein optionaler Parameter wird nur mit einem Attribut versehen. Dieses Attribut weist den Compiler an, den Standardwert für diesen Parameter an der Aufrufstelle einzufügen.
Der Aufruf
obj2.TestMethod();
wird ersetzt durch,obj2.TestMethod(false);
wenn der C # -Code in IL kompiliert wird und nicht zur JIT-Zeit.In gewisser Weise ist es immer der Aufrufer, der den Standardwert mit optionalen Parametern bereitstellt. Dies hat auch Konsequenzen für die binäre Versionierung: Wenn Sie den Standardwert ändern, den aufrufenden Code jedoch nicht neu kompilieren, wird weiterhin der alte Standardwert verwendet.
Sie können das bereits nicht tun, wenn die Schnittstellenmethode war explizit implementiert wurde .
quelle
Da Standardparameter zur Kompilierungszeit und nicht zur Laufzeit aufgelöst werden. Die Standardwerte gehören also nicht zu dem aufgerufenen Objekt, sondern zu dem Referenztyp, über den es aufgerufen wird.
quelle
Optionale Parameter sind nach meinem Verständnis eine Art Makrosubstitution. Sie sind aus Sicht der Methode nicht wirklich optional. Ein Artefakt davon ist das Verhalten, bei dem Sie unterschiedliche Ergebnisse erhalten, wenn Sie auf eine Schnittstelle übertragen.
quelle