Gibt es Best Practices, bei denen der benutzerdefinierte Statuscode nicht in einem System
-Namespace platziert werden sollte? Sollten System
und seine Kinder für Microsoft-Code reserviert sein?
Ich frage, weil ich eine Klassenbibliothek schreibe, die in vielen Projekten verwendet wird, und ich möchte die Dinge konsistent halten, indem ich sie in System.InteropServices
lege (da es sich um P / Invoke handelt).
Das ist keine gute Idee, weil es einen der Hauptvorteile von Namespaces vereitelt: das Verhindern von Namenskonflikten. Was, wenn eine neuere Version des Frameworks einen gleichnamigen Typ in diesem Namespace einführte?
Dies ist besonders schlimm für System
Namespaces, da sie in viele andere Codeteile mit using
Direktiven importiert werden und die Einführung von benutzerdefinierten Typen in diesen Namespaces den Namensbereich anderer Quelldateien mit unerwarteten Bezeichnern beschmutzt.
Um Ihre benutzerdefinierten Interop-Typen zu kategorisieren, können Sie einen neuen Namensraum wie MyProduct.InteropServices
erstellen.
Wenn Sie eine neue Klasse in System.InteropServices
platzieren, muss jede Datei, die eine using System.InteropServices;
-Klausel hat, gezwungen werden, Ihre Klasse im Geltungsbereich zu haben, was den Programmierer verwirren könnte. Da sich der Programmierer dagegen nicht wehren kann, würde ich diese schlechte Praxis in Erwägung ziehen.
Ich stimme nicht mit allen überein.
Ich denke, dass es in einer begrenzten Teilmenge von Fällen (hauptsächlich mit Erweiterungsmethoden) durchaus sinnvoll ist, Code in einen Systemnamensraum zu stellen.
Hier ist meine Seite des Arguments aus einem E-Mail-Thread, in dem wir im System-Namensraum über Extension-Methoden diskutiert haben: EPS :
Ok, also hier ist meine Seite des Arguments:
Ich mag es wirklich, Code zu minimieren. Das schließt Usings ein.
Ja, ReSharper greift auf Erweiterungsmethoden zu und fügt die Usings für Sie hinzu, aber einige Leute haben keinen ReSharper, und außerdem bevorzuge ich Coderush, das bisher (soweit ich weiß) nicht wirklich greift Erweiterungsnamespaces.
Es gibt mindestens zwei verschiedene Arten von Erweiterungsmethoden. Dies sind Hilfsmethoden für unsere Anwendung - einschließlich domänen- und anwendungsspezifischer Helfer, und solche, die Funktionen und Syntax kapseln, von denen wir glauben, dass sie mit der Sprache beginnen sollte.
Ein gutes Beispiel für letzteres ist die Möglichkeit, "a {0} {1}".Format("b", "c")
oder someListOfStrings.Join(", ")
auszuführen, anstatt String.Join(someStringList.ToArray(), ", ")
zu tun. Andere umstrittenere Beispiele sind IEnumerable<T>.ForEach
und die Erweiterung IsNull()
, die den Platz der unbeholfenen object.ReferenceEquals(null, someVar)
-Syntax einnehmen.
Mein Argument ist, dass es allen Grund gibt, diese letztere Klassifizierung - Ihr Team stimmt weitgehend überein, sollte in der Sprache sein, aber nicht - im entsprechenden Namespace (System, System.IO, System.Linq, etc.) zu platzieren. . Wir möchten, dass diese Funktionen überall verfügbar sind, so wie wir es bevorzugen, dass die Schlüsselwörter foreach und yield immer sichtbar sind. Wenn es jedoch anwendungsspezifisch ist, sollte es in einem eigenen Namensraum liegen. In 90% der Fälle sollten anwendungsspezifische Helfererweiterungen wahrscheinlich keine Erweiterungen sein und nicht einmal statisch sein. Ich schließe aus dieser Anweisung aus, indem ich Erweiterungsmethoden verwende, um Aliase für Funktionsnamen bereitzustellen.
Damit können Sie natürlich Probleme bekommen, wenn Sie in Assemblys anrufen, die systemweite Erweiterungen enthalten. Angenommen, ich habe auf die Assembly verwiesen, die meine void IEnumerable<T>.ForEach
-Methode enthält, und wollte meine eigene rubinähnliche R IEnumerable<T, R>.ForEach
erstellen (was eigentlich nur eine Auswahl ist, aber vergiss das nicht). Das wäre ein Problem! Was ich tun möchte, um das Problem zu verringern, besteht darin, meine Erweiterungsklassen als intern zu definieren, sodass sie nur für mein Projekt verwendet werden können. Dies löst das Problem gut.
Tags und Links .net c# namespaces