Frage

Ich habe eine Methode von einem Objekt, das so etwas wie eine Fabrik.Sie geben ein Typ, der es erstellt eine Instanz und noch ein paar andere Dinge.Ein eleganter Weg, es zu tun (meiner Meinung nach) ist, wie diese:

public T MagicMethod<T>() where T: SomeBaseClass
{
    // Magic goes here
}

Aber dies stört FxCop-wer sagt, das ist ein schlechter Stil, - ich bekomme eine "CA1004:Generische Methoden liefern sollte, die parameter vom Typ" Warnung.Etwas, das nicht zu verwenden, Inferenz und Zeug.Also, die einzige andere Möglichkeit, die ich denken kann, ist so etwas wie dieses:

public SomeBaseClass MagicMethod(Type T)
{
    // Same magic goes here
}

Ich glaube, das ist schlechter als die erste Methode, die auf vielen Konten, sondern der Stil-Regel...Der MSDN-Artikel über die Warnung noch sagt, dass es keinen Grund für das unterdrücken es.

Mache ich es richtig durch die Unterdrückung dieser Warnung, nachdem alle?

War es hilfreich?

Lösung

FXCop Warnungen sind genau die - Warnungen. Genau wie implizite Umwandlung Warnungen dienen sie Sie wissen zu lassen, dass etwas, das Sie tun Verhalten haben, können Sie nicht erwarten sind, oder es kann nicht sein, was Sie bestimmt.

Eine implizite gegossene Warnung mit auf dem Code, indem Sie behandelt, determinining, wenn Sie wirklich das zu tun, die Absicht haben, und wenn ja, eine explizite Umwandlung hinzugefügt wird.

Das Gleiche gilt für FXCop. Schauen Sie sich die Warnung, sehen Sie Ihren Code, und bestimmen, ob die Warnung gültig ist. Wenn es ist, beheben. Wenn nicht, unterdrücken sie. Eine Unterdrückung ist das Äquivalent eines expliziten Cast - „Ja., FXCop, ich bin sicher, dass ich dies tun wollen“

Wenn es wirklich wirklich ein Fehler, wäre es wahrscheinlich ein Compiler-Fehler sein.

Andere Tipps

Ich glaube, du Missverständnis, was FxCop sagt Ihnen, wahrscheinlich, weil seine Formulierung weniger als ideal ist. Was es bedeutet, dass eine generische Methode sollte einen Parameter liefern, dass dieses Typs ist , nicht, dass ein generisches Verfahren zur Herstellung einer nicht-generische Überlastung haben sollte, die eine Laufzeit Type Instanz bietet . Zum Beispiel:

public void DoSomething<T>(T myParam);

Die myParam ist die Art von Parameter es sich bezieht. Der Grund, es möge dies ist, wie Sie vorschlagen, für Inferenz. Auf diese Weise können Sie so etwas wie zu tun ...

string foo = "bar";

DoSomething(foo);

anstatt schreiben von

DoSomething<string>(foo);

In Ihrem Fall ist es in Ordnung, die Warnung zu unterdrücken, da Sie wollen der Benutzer explizit den Typ angeben. Ich würde vorschlagen, jedoch (unter der Annahme, dass Ihre Konstrukteure parameterlos sind), dass Sie Ihre where ändern where T : SomeBaseClass, new(). Dies bedeutet, dass es den Compiler leiten wird zu verlangen, dass unabhängig von der Art übergeben wird in einen parameterlosen Konstruktor hat. Das bedeutet auch, dass Sie new T() im Code tun können.

Ich hätte kein Problem mit der Unterdrückung dieser Warnung.Für den Anfang ist die äquivalente in den MS-eigenen code ist Activator.CreateInstance<T>()

public static T CreateInstance<T>()

Es impliziert, dass die Analyse Regel sollten Sie prüfen, ob die return type die Methode ist abgedeckt durch den generischen parameter...

Dies wurde bereits in vielen Orten vor:

Und es gab frühere bugs in der Regel für Beispiel:

public static void GenericMethod<T>(List<T> arg);

zuvor würde es auslösen (Feste im Jahr 2005 SP1).

Ich schlage vor Einreichung eine Verbindung Fehler mit Ihren spezifischen Beispiel

FxCop wird diese Warnung ausgelöst, auch wenn Sie den generischen Typparameter in einer oder mehreren der Argumente verwenden zu tun, wenn es nicht „gestrippt“ ist:

public void LinkedList<T> Slice<T>(LinkedList<T> collection, Predicate<T> match)
{
    ...
}

Mindestens Regel ‚CA1004‘ gefeuert „irrtümlich“ hier neulich auf einem Verfahren mit dieser Signatur.

Für schlauer als die FxCop Team zu sein, ich bin mir nicht sicher, dass die Regeln der Lage sind, korrekt Code in allen Fällen zu bestimmen, das ist, was das Vertrauensniveau ist für:)

Der zweite Ansatz ist nicht einmal gleichbedeutend mit dem ersten. In der zweiten, Sie sind buchstäblich eine Art gegeben, aber Sie können ein Objekt dieser Art nicht instanziiert (es sei denn, Sie verwenden Reflection --- eeek!) Und Sie müssen explizit den Rückgabetyp erklären (die den Zweck von Generika besiegt zu zunächst einmal).

Siehe diese Notiz darüber zu unterdrücken. Es sieht aus wie es okay ist, zu unterdrücken.

EDIT: Hier ist eine andere Idee. Was ist, wenn Sie es zu einem ‚out‘ Parameter geändert und durch die Rückgabevariable nicht zurück? Wäre es die Warnung dann entfernen?

public void MagicMethod<T>( out T retVar ) where T: SomeBaseClass
{
    // Magic goes here
}

persönlich mit den meisten Warnung in FXCop ich stören würde.

Sie scheinen zu wissen, was Sie tun, warum sollten einige automatisierte Stück Software besser wissen?

Nun, es kann nicht, es ist eine Vermutung.

Zu allererst dieser Warnung ist nur sicher zu stellen, dass Anrufer alles wissentlich tun. Es ist möglich, Ihre Methode aufrufen, ohne jede Art Parameter übergeben, da der Compiler den Typ des Objekts, bevor die Hand kennt. FxCop sagen Ihnen, läßt es implizit sein, so dass Syntax für die Verwendung generische und nicht generische Überlastungen identisch aussieht (Ich bin nicht einverstanden mit diesem Prinzip aber das ist persönlich und nicht relevant hier).

Zweitens Ihre zweite Methode wird mehr Schaden anrichten, als Sie von jetzt denken können. Es gibt keinen Zeittyp der Kompilierung gibt es überprüft, so dass die Laufzeit ungültig Guss Ausnahmen gewarnt werden, wenn Sie es verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top