Ich stimme nicht mit allen überein.
Ich denke, dass in einer begrenzten Teilmenge von Fällen (meist mit Erweiterungsmethoden) es durchaus sinnvoll ist, Code in einem Systemnamespace zu platzieren.
Hier ist meine Seite des Arguments aus einem E-Mail-Thread wir Erweiterungsmethoden im System-Namespace über an EPS debattieren hatten:
Ok, hier so 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 den Gebrauch für Sie hinzu, aber einige Leute haben ReSharper nicht, und außerdem bevorzuge ich Coderush, das bis jetzt (soweit ich weiß) keine Erweiterung auswählt Namespaces.
Es gibt mindestens zwei verschiedene Arten von Erweiterungsmethoden; Diese 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 hätte beginnen sollen.
Ein gutes Beispiel für letzteres ist die Fähigkeit, "a {0} {1}".Format("b", "c")
oder someListOfStrings.Join(", ")
eher zu tun, als String.Join(someStringList.ToArray(), ", ")
zu tun. Andere umstrittenere Beispiele sind IEnumerable<T>.ForEach
und die IsNull()
Erweiterung, die die plumpe object.ReferenceEquals(null, someVar)
Syntax ersetzen.
Mein Argument ist, dass es allen Grund gibt, diese letztere Klassifizierung - Ihr Team ist weitgehend einverstanden in der Sprache, aber nicht - in den entsprechenden Namespace (System, System.IO, System.Linq usw.) 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 diese Anweisung aus, indem ich Erweiterungsmethoden verwende, um Aliase für Funktionsnamen bereitzustellen.
Sie können natürlich Probleme bekommen, wenn Sie in Assemblys anrufen, die systemweite Erweiterungen enthalten. Angenommen, ich habe auf die Assembly verwiesen, die meine void-Methode IEnumerable<T>.ForEach
enthält, und wollte mein eigenes Ruby-ähnliches R IEnumerable<T, R>.ForEach
erstellen (was eigentlich nur ein Select 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.
Ich wollte einen Kind-Namespace von 'System.InteropServices' erstellen, um das zu vermeiden, aber ich sehe, dass es wahrscheinlich immer noch keine gute Idee ist. –