Ich habe eine Methode wie folgt:
%Vor%Die neuen Anforderungen führen zu einer Änderung wie folgt:
%Vor% Das Problem ist, dass, obwohl ich die Methodensignatur geändert habe, keine Kompilierungsfehler auftreten, was natürlich korrekt ist, aber ich möchte, dass bei jedem Aufruf von Foo
Methode Kompilierungsfehler auftreten, wobei das Argument baz
wurde nicht angegeben. Das heißt, wenn ein Aufruf von Foo
vor der Änderung war:
muss jetzt dieser sein:
%Vor% Wenn es auf diese Weise nicht geändert würde, würde p1
baz
zugewiesen, und das Parameter-Array args
würde die Länge 1 haben und eine OutOfBounds
Ausnahme würde ausgelöst werden.
Was ist der beste Weg, um die Signatur zu ändern und sicherzustellen, dass der gesamte aufrufende Code entsprechend aktualisiert wird? (Im realen Szenario befindet sich Foo
in einer Assembly, die von vielen Projekten gemeinsam genutzt wird, die automatisch auf einem Build-Server erstellt werden. Ein Kompilierungsfehler wäre daher eine einfache Möglichkeit, den gesamten Code zu erkennen, der zur Anpassung der Änderung benötigt wird.)
Bearbeiten: Daniel Mann und andere wiesen darauf hin, dass das obige Beispiel darauf hindeutet, dass ich überhaupt keine Params verwenden sollte. Also sollte ich erklären, dass es in meinem Beispiel aus der realen Welt nicht immer so ist, dass Argumente zwei Elemente haben müssen. Soweit es die Logik in Foo betrifft, können Argumente eine beliebige Anzahl von Elementen enthalten. Also sagen wir, das ist Foo:
%Vor% Hier ist die Lösung. Ändern Sie nicht die frühere Methodensignatur, fügen Sie einfach das Attribut Obsolete
mit den beiden angegebenen Argumenten hinzu.
Erstellen Sie dann eine neue Methode mit einer neuen Signatur.
%Vor% Das zweite Argument im Attribut Obsolete
stellt einen Kompilierungsfehler sicher. Ohne es verursacht es nur eine Kompilierungswarnung. Weitere Informationen zu diesem Attribut finden Sie unter MSDN .
BEARBEITEN:
Aufgrund der Diskussion in den Kommentaren hat Daniel Mann ein interessantes Problem gefunden.
Das würde das Problem nicht lösen. Wie wäre es, wenn du Foo ("a", "b") nennst? In diesem Fall wird es immer noch die nicht-veraltete Methode mit nur zwei Argumenten aufrufen und das gleiche Problem verursachen.
Ich würde empfehlen, zu überprüfen, ob mehr als ein Argument durch args
übergeben wurde, bevor bar
aufgerufen wurde.
Die einfachste Lösung besteht darin, das Schlüsselwort params
nicht zu verwenden, wenn Sie erforderliche -Parameter haben.
Sie erwarten natürlich, dass args
mindestens zwei Parameter enthält. Es ist sicher zu sagen, dass diese erforderlich sind. Warum nicht eine solche Methodensignatur?
public void Foo(string baz, string requiredArgument1, string requiredArgument2, params string[] optionalArguments)
Das entfernt die Mehrdeutigkeit: Es wird immer benötigt mindestens 3 Argumente.
Eine weitere Option, an die ich aus irgendeinem Grund nicht gedacht habe, ist die Verwendung benannter Parameter. Offensichtlich müsste Ihr Code dies explizit tun, aber Sie könnten dies tun:
Foo(baz: "bar", args: new [] {"a", "b", "c"});
Tags und Links c# params-keyword