So stellen Sie sicher, dass bei der Änderung der Signatur kein Übersetzungsfehler auftritt, wenn das Schlüsselwort params verwendet wird

8

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:

%Vor%

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%     
tyrone copex 05.12.2013, 13:00
quelle

2 Antworten

3

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.

%Vor%

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.

    
Ondrej Janacek 05.12.2013 13:24
quelle
2

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"});

    
Daniel Mann 05.12.2013 13:52
quelle

Tags und Links