Warum nicht verwendete Anweisungen in C # entfernen?


120

Ich frage mich, ob es Gründe gibt (abgesehen vom Aufräumen des Quellcodes), warum Entwickler die Funktion "Nicht verwendete entfernen Usings" in Visual Studio 2008 verwenden.


Ich glaube, das ist eine Funktion von PowerCommands für Visual Studio, nicht von Visual Studio selbst.
Hosam Aly

3
In VS2008 ist es sicherlich eine Funktion (zusammen mit der Möglichkeit, die using-Anweisungen zu sortieren) von VS selbst.
Richard

1
@Hosam: Mit PowerCommands können Sie dies für das gesamte Projekt / die gesamte Lösung tun. Dies pro Datei zu tun, ist eine Funktion von VS.
Konfigurator

3
Übrigens, schauen Sie sich Resharper an, wenn Sie eine genauere Kontrolle über diese Art der Bereinigung wünschen.
John Feminella

2
Ich mag diese Funktion eigentlich nicht - ich bearbeite ausnahmslos eine Datei und muss alle System-Namespaces erneut hinzufügen, nachdem jemand sie bereinigt hat (normalerweise System, System.Collections.Generic und System.Linq.) mehr Reibung als es spart. Jetzt Ihre eigenen Projekt-Namespaces anstelle von Framework-Namespaces - diese sind sinnvoller, um die Verkabelung Ihres Programms zu bereinigen und zu klären. Ich wünschte, es gäbe eine Möglichkeit, VS-Importe nur von bestimmten Namespaces bereinigen zu lassen und die System-Importe zu belassen, die Sie häufiger benötigen.
user1454265

Antworten:


186

Es gibt einige Gründe, warum Sie sie herausnehmen möchten.

  • Es ist zwecklos. Sie schaffen keinen Wert.
  • Es ist verwirrend. Was wird aus diesem Namespace verwendet?
  • Wenn Sie dies nicht tun, sammeln Sie nach und nach sinnlose usingAnweisungen, wenn sich Ihr Code im Laufe der Zeit ändert.
  • Die statische Analyse ist langsamer.
  • Die Codekompilierung ist langsamer.

Auf der anderen Seite gibt es nicht viele Gründe, sie zu belassen. Ich nehme an, Sie sparen sich die Mühe, sie löschen zu müssen. Aber wenn Sie so faul sind, haben Sie größere Probleme!


59
Ein guter Programmierer ist faul, er maximiert die Arbeit, um NICHT zu tun. : D
Nicolas Dorier

34
Ich stimme nicht zu, dass ein guter Programmierer faul ist, aber ich stimme dem Gefühl Ihrer Aussage zu. Ein guter Programmierer wird sie löschen, um seinen Code sauber zu halten und dadurch zukünftige Arbeiten / Probleme / Probleme für sich und andere zu vermeiden.
Allan

2
Richtig, das ist eine großartige Verbindung. Ich denke mein Punkt war nur, dass wir eher "gut faul" als "schlecht faul" wollen; In letzterem Fall konnten sich Programmierer nicht die Mühe machen, guten Code zu schreiben.
Allan

5
Es ist sinnvoll, auch Standard-Namespaces beizubehalten. Wenn Sie große Projekte und Teams belassen, führt dies zu weniger potenziellen Zusammenführungskonflikten und weniger Dateien für die Codeüberprüfung. Darüber hinaus fügen viele Entwickler den Dingen verwirrende und schwer zu findende Erweiterungsmethoden hinzu, und manchmal ist es mühsam, die erforderlichen Namespaces für diese Erweiterungsmethoden zu finden. Neue Entwickler sind möglicherweise daran gewöhnt, System.Linq in ihren Codedateien zu haben, und verschwenden viel Zeit damit, herauszufinden, warum bestimmte Methoden nicht verfügbar sind, bevor sie um Hilfe bitten.
Markieren Sie an der Rampe 51

5
Vielleicht möchten Sie einige davon behalten, um zu verhindern, dass der Intellisense bei zukünftigen Codierungen höllisch dumm ist.
Yazanpro

24

Ich würde ganz im Gegenteil sagen - es ist äußerst hilfreich, unnötige, unnötige Anweisungen zu entfernen.

Stellen Sie sich vor, Sie müssen in 3, 6, 9 Monaten zu Ihrem Code zurückkehren - oder jemand anderes muss Ihren Code übernehmen und ihn pflegen.

Wenn Sie eine riesige, lange Wäscheliste mit Anweisungen haben, die nicht wirklich benötigt werden, kann das Betrachten des Codes ziemlich verwirrend sein. Warum wird das dort verwendet, wenn nichts von diesem Namespace verwendet wird?

Ich denke, im Hinblick auf die langfristige Wartbarkeit in einem professionellen Umfeld würde ich dringend empfehlen, Ihren Code so sauber wie möglich zu halten - und dazu gehört auch, unnötiges Material daraus zu entfernen. Weniger Unordnung bedeutet weniger Verwirrung und damit höhere Wartbarkeit.

Marc


14

Dies scheint mir eine sehr vernünftige Frage zu sein, die von den antwortenden Personen ziemlich leichtfertig behandelt wird.

Ich würde sagen, dass jede Änderung des Quellcodes gerechtfertigt sein muss. Diese Änderungen können versteckte Kosten verursachen, und die Person, die die Frage stellt, wollte darauf aufmerksam gemacht werden. Sie haben nicht darum gebeten, "faul" genannt zu werden, wie eine Person nachahmte.

Ich habe gerade angefangen, Resharper zu verwenden, und es gibt Warnungen und Stilhinweise zu dem Projekt, für das ich verantwortlich bin. Dazu gehört die Beseitigung redundanter Maßnahmen mithilfe der Richtlinie, aber auch redundante Qualifikationsmerkmale, Kapitalisierung und vieles mehr. Mein Bauchgefühl ist es, den Code aufzuräumen und alle Hinweise aufzulösen, aber mein Geschäftsleiter warnt mich vor ungerechtfertigten Änderungen.

Wir verwenden einen automatisierten Erstellungsprozess. Daher würde jede Änderung an unserem SVN-Repository Änderungen erzeugen, die wir nicht mit Projekten / Fehlern / Problemen verknüpfen konnten, und automatisierte Erstellungen und Releases auslösen, die keine funktionalen Änderungen an früheren Versionen lieferten.

Wenn wir uns das Entfernen redundanter Qualifizierer ansehen, kann dies möglicherweise zu Verwirrung bei Entwicklern führen, da Klassen, in denen unsere Domänen- und Datenebenen nur durch die Qualifizierer unterschieden werden.

Wenn ich mir die richtige Verwendung der Großschreibung von Anachronymen (dh ABCD -> Abcd) anschaue, muss ich berücksichtigen, dass Resharper keine der XML-Dateien, die wir mit diesen Referenzklassennamen verwenden, umgestaltet.

Das Befolgen dieser Hinweise ist also nicht so einfach, wie es scheint, und sollte mit Respekt behandelt werden.


6
Guter Punkt, aber Sie sollten auch nicht vergessen, dass das Aufrechterhalten von sauberem, unkompliziertem Code die Wartbarkeit verbessert, was auch ein Geschäftsziel ist. Sie müssen beide wiegen. Idealerweise möchten Sie diese Art von Refactorings direkt nach einer Veröffentlichung durchführen, damit Sie einen möglichst sauberen Plan haben, um einen neuen zu starten, und genügend Zeit haben, um eventuelle Regressionen zu erkennen.
David Reis

14

Zusätzlich zu den bereits genannten Gründen werden unnötige Namenskonflikte vermieden. Betrachten Sie diese Datei:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

Dieser Code wird nicht kompiliert, da beide Namespaces System.IO und System.Windows.Shapes jeweils eine Klasse namens Path enthalten. Wir könnten es beheben, indem wir den vollständigen Klassenpfad verwenden.

        private static string temporaryPath = System.IO.Path.GetTempFileName();

oder wir könnten einfach die Linie entfernen using System.Windows.Shapes;.


13

Weniger Optionen im Intellisense-Popup (insbesondere wenn die Namespaces viele Erweiterungsmethoden enthalten).

Theoretisch sollte Intellisense auch schneller sein.


1
+1 für Intellisense. Beim Start ist es tatsächlich langsam (ich sehe regelmäßig "Cache erstellen, später erneut versuchen"), daher kann dies tatsächlich von Bedeutung sein. Kompilieren Sie die Zeit, über die alle anderen sprechen ... Ich habe noch keine Zahlen gesehen.
Luc

5

Entferne sie. Weniger Code zum Anschauen und Staunen spart Zeit und Verwirrung. Ich wünschte, mehr Leute würden die Dinge einfach, ordentlich und ordentlich halten. Es ist, als hätten Sie schmutzige Hemden und Hosen in Ihrem Zimmer. Es ist hässlich und man muss sich fragen, warum es da ist.


4

Es hilft auch, falsche zirkuläre Abhängigkeiten zu vermeiden, vorausgesetzt, Sie können auch einige DLL- / Projektreferenzen aus Ihrem Projekt entfernen, nachdem Sie die nicht verwendeten Verwendungen entfernt haben.


3

Code wird schneller kompiliert.


5
Haben Sie Beweise dafür?
cjk

14
Oh CK - du hast mich wieder erwischt. Ich habe gelogen. Durch das Entfernen von unnötigem Text wird das Kompilieren des Codes langsamer. Denken Sie darüber nach :)
Dead Account

@ck: Ich habe überprüft, dass das Entfernen nicht verwendeter Anweisungen aus einem Projekt bei der Arbeit die Kompilierungszeit um einen spürbaren Betrag verbessert. Natürlich würde es - weniger Bytes von der Festplatte zu lesen.
Konfigurator

19
Es wäre schön, einige echte Statistiken zu sehen. Wenn wir beim Kompilieren nur wenige Millisekunden sparen, ist Geschwindigkeit kein zwingendes Argument. Es gibt jedoch noch andere Gründe, nicht benötigte Anweisungen zu entfernen.
Greg

3
Es geht nicht darum zu lügen oder nicht. Jeder vernünftige Mensch würde vermuten, dass weniger Unordnung mehr Effizienz bedeutet. Der "Beweis" für die Sicherung besteht darin, Ihrer Antwort einen Wert zu verleihen und das Argument zu unterstützen, dass "schneller" nicht nur ein paar ms bedeutet, sondern tatsächlich eine verbesserte Erfahrung, um Ihr Projekt schneller zu kompilieren.
Matheus Felipe

3

Kürzlich habe ich einen weiteren Grund bekommen, warum das Löschen nicht verwendeter Importe sehr hilfreich und wichtig ist.

Stellen Sie sich vor, Sie haben zwei Baugruppen, von denen eine auf die andere verweist (nennen wir zunächst die erste Aund die referenzierte B). Wenn Sie nun Code in A haben, der von B abhängt, ist alles in Ordnung. Irgendwann in Ihrem Entwicklungsprozess stellen Sie jedoch fest, dass Sie diesen Code tatsächlich nicht mehr benötigen, sondern die using-Anweisung dort belassen, wo sie war. Jetzt haben Sie nicht nur eine bedeutungslose usingDirektive, sondern auch eine Assembly-Referenz, auf Bdie nur in der veralteten Direktive verwiesen wird. Dies erhöht zum einen den Zeitaufwand für das Kompilieren A, der Bebenfalls geladen werden muss.

Dies ist also nicht nur ein Problem in Bezug auf saubereren und leichter lesbaren Code, sondern auch in Bezug auf die Beibehaltung von Assembly-Referenzen im Produktionscode, wo nicht alle Assemblys, auf die verwiesen wird, überhaupt existieren .

Schließlich mussten wir in unserem Beispiel B und A zusammen versenden, obwohl B nirgendwo in A, sondern in der usingSektion verwendet wird. Dies wirkt sich massiv auf die LaufzeitleistungA beim Laden der Baugruppe aus.


2

Zumindest theoretisch sollten Sie in der Lage sein, den Code zu betrachten und eine Umgebung zu erstellen, die alles simuliert, was benötigt wird, wenn Sie eine C # .cs-Datei (oder eine einzelne Programmquellcodedatei) erhalten haben. Mit einigen Kompilierungs- / Parsing-Techniken können Sie sogar ein Tool erstellen, das dies automatisch ausführt. Wenn Sie dies zumindest im Auge behalten, können Sie sicherstellen, dass Sie alles verstehen, was in der Codedatei steht.

Überlegen Sie nun, ob Sie eine CS-Datei mit 1000 usingAnweisungen erhalten haben, von denen nur 10 tatsächlich verwendet wurden. Wenn Sie sich ein Symbol ansehen, das neu in den Code eingeführt wurde, der auf die Außenwelt verweist, müssen Sie diese 1000 Zeilen durchgehen, um herauszufinden, was es ist. Dies verlangsamt offensichtlich das obige Verfahren. Wenn Sie sie also auf 10 reduzieren können, hilft es!

Meiner Meinung nach ist die C # using-Direktive sehr, sehr schwach, da Sie kein einzelnes generisches Symbol angeben können, ohne dass die Generizität verloren geht, und Sie können keine usingAlias-Direktive verwenden, um Erweiterungsmethoden zu verwenden. Dies ist in anderen Sprachen wie Java, Python und Haskell nicht der Fall. In diesen Sprachen können Sie (fast) genau angeben, was Sie von der Außenwelt erwarten. Aber dann werde ich vorschlagen, usingwann immer möglich einen Alias zu verwenden .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.