Po co usuwać nieużywane dyrektywy using w C #?


120

Zastanawiam się, czy są jakieś powody (poza porządkowaniem kodu źródłowego), dla których programiści używają funkcji „Usuń nieużywane Usings” w programie Visual Studio 2008?


Uważam, że jest to funkcja PowerCommands for Visual Studio, a nie samego Visual Studio.
Hosam Aly,

3
W VS2008 jest to z pewnością funkcja (wraz z możliwością sortowania instrukcji using) samego VS.
Richard

1
@Hosam: PowerCommands umożliwia Ci to dla całego projektu / rozwiązania. Robienie tego dla każdego pliku jest cechą samego VS.
konfigurator

3
Swoją drogą, sprawdź Resharper, jeśli chcesz mieć większą kontrolę nad tego rodzaju porządkami.
John Feminella,

2
Naprawdę nie podoba mi się ta funkcja - niezmiennie edytuję plik i muszę ponownie dodawać wszystkie przestrzenie nazw Systemu po tym, jak ktoś je wyczyścił (zwykle System, System.Collections.Generic i System.Linq). więcej tarcia niż oszczędza. Teraz przestrzenie nazw twojego projektu, a nie przestrzenie nazw frameworków - mają większy sens, aby je wyczyścić, aby wyjaśnić okablowanie twojego programu. Żałuję, że nie ma sposobu, aby VS wyczyścił importy tylko z niektórych przestrzeni nazw i pozostawił te systemowe, których potrzebujesz częściej.
user1454265

Odpowiedzi:


186

Jest kilka powodów, dla których chcesz je usunąć.

  • To bezcelowe. Nie dodają żadnej wartości.
  • To zagmatwane. Co jest używane z tej przestrzeni nazw?
  • Jeśli tego nie zrobisz, będziesz stopniowo gromadzić bezsensowne usinginstrukcje, gdy kod będzie się zmieniał w czasie.
  • Analiza statyczna jest wolniejsza.
  • Kompilacja kodu jest wolniejsza.

Z drugiej strony nie ma wielu powodów, aby je zostawić. Przypuszczam, że oszczędzasz sobie wysiłku związanego z ich usuwaniem. Ale jeśli jesteś taki leniwy, masz większe problemy!


59
Dobry programista JEST leniwy, maksymalizuje pracę, aby NIE wykonywać. : D
Nicolas Dorier

34
Nie zgadzam się, że dobry programista jest leniwy, ale zgadzam się z sentymentem twojego oświadczenia. Dobry programista usunie je, aby utrzymać swój kod w czystości, a tym samym uniknąć przyszłej pracy / problemów / problemów dla siebie i innych.
Allan

2
Racja, to świetny link. Chyba chodziło mi o to, że chcemy raczej „dobrego leniwego” niż „złego lenia”; ten ostatni był miejscem, w którym programiści nie mogli zawracać sobie głowy pisaniem dobrego kodu.
Allan

5
Opuszczenie standardowych przestrzeni nazw jest również korzystne. W przypadku dużych projektów i zespołów pozostawienie ich skutkuje mniejszą liczbą potencjalnych konfliktów scalania i mniejszą liczbą plików do przeglądu kodu. Ponadto wielu programistów dodaje do rzeczy mylące i trudne do znalezienia metody rozszerzające, a czasami zlokalizowanie wymaganych przestrzeni nazw dla tych metod rozszerzeń jest kłopotliwe. Nowi programiści mogą być przyzwyczajeni do umieszczania System.Linq w swoich plikach kodowych i tracić dużo czasu, próbując dowiedzieć się, dlaczego niektóre metody nie są dostępne, zanim poproszą o pomoc.
Mark At Ramp51

5
Możesz zatrzymać niektóre z nich, aby inteligencja nie była głupia jak diabli w przyszłym kodowaniu.
yazanpro

24

Powiedziałbym wręcz przeciwnie - niezwykle pomocne jest usuwanie niepotrzebnych, niepotrzebnych instrukcji użycia.

Wyobraź sobie, że musisz wrócić do swojego kodu za 3, 6, 9 miesięcy - albo ktoś inny musi przejąć Twój kod i go utrzymywać.

Jeśli masz ogromną, długą listę instrukcji użycia, które nie są naprawdę potrzebne, spojrzenie na kod może być dość mylące. Dlaczego jest tam używanie, jeśli nic nie jest używane z tej przestrzeni nazw?

Wydaje mi się, że jeśli chodzi o długoterminową konserwację w środowisku zawodowym, zdecydowanie sugerowałbym, aby kod był tak czysty, jak to tylko możliwe - i obejmuje to zrzucanie z niego niepotrzebnych rzeczy. Mniej bałaganu oznacza mniej zamieszania, a tym samym wyższą łatwość konserwacji.

Marc


14

Wydaje mi się, że jest to bardzo rozsądne pytanie, które jest traktowane w dość nonszalancki sposób przez respondentów.

Powiedziałbym, że każda zmiana w kodzie źródłowym musi być uzasadniona. Zmiany te mogą wiązać się z ukrytymi kosztami, a osoba stawiająca pytanie chciała zostać o tym poinformowana. Nie prosili, by nazywano ich „leniwymi”, jak naśladowała jedna osoba.

Właśnie zacząłem używać Resharpera i zaczyna dawać ostrzeżenia i wskazówki dotyczące stylu projektu, za który jestem odpowiedzialny. Wśród nich jest usunięcie zbędnych dyrektyw using, ale także zbędnych kwalifikatorów, kapitalizacji i wielu innych. Mój instynkt polega na uporządkowaniu kodu i rozwiązaniu wszystkich podpowiedzi, ale głowa biznesowa ostrzega mnie przed nieuzasadnionymi zmianami.

Używamy zautomatyzowanego procesu kompilacji, a zatem każda zmiana w naszym repozytorium SVN spowodowałaby zmiany, których nie mogliśmy połączyć z projektami / błędami / problemami, i spowodowałaby automatyczne kompilacje i wydania, które nie wprowadziły żadnych zmian funkcjonalnych do poprzednich wersji.

Jeśli spojrzymy na usunięcie zbędnych kwalifikatorów, może to spowodować zamieszanie wśród programistów, ponieważ klasy nasze domeny i warstwy danych są rozróżniane tylko na podstawie kwalifikatorów.

Jeśli spojrzę na właściwe użycie wielkich liter w anachronimach (np. ABCD -> Abcd), to muszę wziąć pod uwagę, że Resharper nie refaktoryzuje żadnego z plików Xml, których używamy w nazwach klas odniesienia.

Dlatego stosowanie się do tych wskazówek nie jest tak proste, jak się wydaje, i należy je traktować z szacunkiem.


6
Dobra uwaga, ale nie należy również zapominać, że utrzymywanie czystego, nieskomplikowanego kodu zwiększa łatwość konserwacji, która jest również celem biznesowym. Musisz zważyć oba. Idealnie byłoby, gdybyś chciał przeprowadzić tego rodzaju refaktoryzacje zaraz po wydaniu, aby mieć jak najczystszą kartę, aby rozpocząć nową i mieć dużo czasu na wyłapanie ewentualnych regresji.
David Reis,

14

Oprócz podanych już powodów zapobiega niepotrzebnym konfliktom nazw. Rozważ ten plik:

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

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

Ten kod nie jest kompilowany, ponieważ oba obszary nazw System.IO i System.Windows.Shapes zawierają klasę o nazwie Path. Mogliśmy to naprawić, używając pełnej ścieżki klas,

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

lub możemy po prostu usunąć tę linię using System.Windows.Shapes;.


13

Mniej opcji w wyskakującym okienku Intellisense (szczególnie jeśli przestrzenie nazw zawierają wiele metod rozszerzenia).

Teoretycznie Intellisense też powinien być szybszy.


1
+1 do inteligencji. W rzeczywistości jest powolny podczas uruchamiania (regularnie widzę „Tworzenie pamięci podręcznej, spróbuj ponownie później”), więc może to być istotne. Czas kompilacji, o którym wszyscy mówią ... Jeszcze nie widziałem liczb.
Luc,

5

Usuń ich. Mniej kodu do obejrzenia i zastanowienia się oszczędza czas i nieporozumienia. Chciałbym, żeby więcej ludzi utrzymywało RZECZY PROSTE, CZYSTE i POKŁADANE. To tak, jakbyś miał w pokoju brudne koszule i spodnie. Jest brzydki i trzeba się zastanawiać, dlaczego tam jest.


4

Pomaga również zapobiegać fałszywym zależnościom cyklicznym, zakładając, że po usunięciu nieużywanych zastosowań możesz również usunąć niektóre odwołania do bibliotek dll / projektów z projektu.


3

Kod kompiluje się szybciej.


5
Masz jakieś dowody na poparcie tego?
cjk

14
Oh CK - znowu mnie złapałeś. Kłamałem. Usunięcie niepotrzebnego tekstu w rzeczywistości spowalnia kompilację kodu. Pomyśl o tym :)
Martwe konto

@ck: Sprawdziłem, że usunięcie nieużywanych instrukcji using z projektu w pracy poprawiło czas kompilacji o zauważalną wartość. Oczywiście, że tak - mniej bajtów do odczytania z dysku twardego.
konfigurator

19
Byłoby miło zobaczyć prawdziwe statystyki. Jeśli podczas kompilacji oszczędzamy tylko kilka milisekund, szybkość nie jest przekonującym argumentem. Istnieją jednak inne powody, aby usunąć niepotrzebne instrukcje za pomocą.
Greg

3
Nie chodzi o kłamstwo, czy nie. Każdy rozsądny człowiek zgadłby, że mniej bałaganu oznacza większą wydajność. „Dowodem” na to jest zapewnienie wartości Twojej odpowiedzi i poparcie argumentu, że „szybciej” nie oznacza tylko kilku ms, ale w rzeczywistości lepsze wrażenia umożliwiające szybszą kompilację projektu.
Matheus Felipe

3

Niedawno dostałem kolejny powód, dla którego usuwanie nieużywanych importów jest bardzo pomocne i ważne.

Wyobraź sobie, że masz dwa zestawy, z których jeden odwołuje się do drugiego (na razie nazwijmy pierwszy Ai ten, do którego się odwołuje B). Teraz, gdy masz kod w A, który zależy od B, wszystko jest w porządku. Jednak na pewnym etapie procesu tworzenia zauważysz, że w rzeczywistości nie potrzebujesz już tego kodu, ale pozostawiasz instrukcję using tam, gdzie była. Teraz masz nie tylko bezsensowną using-dyrektywę, ale także odniesienie do zestawu,B które nie jest używane nigdzie, ale w przestarzałej dyrektywie. Po pierwsze, zwiększa to ilość czasu potrzebnego na kompilację A, która również Bmusi zostać załadowana.

Jest to więc problem nie tylko z czystszym i łatwiejszym do odczytania kodem, ale także z utrzymaniem odwołań do zestawów w kodzie produkcyjnym, w którym nie wszystkie z tych zestawów w ogóle istnieją .

W końcu w naszym przykładzie musieliśmy wysłać B i A razem, chociaż B nie jest używane nigdzie w A, ale w sekcji using. Będzie to znacznie wpłynąć na wykonawczego -przedstawienie się Apodczas ładowania zespół.


2

Przynajmniej w teorii, jeśli otrzymałeś plik C # .cs (lub dowolny pojedynczy plik kodu źródłowego programu), powinieneś być w stanie spojrzeć na kod i stworzyć środowisko, które symuluje wszystko, czego potrzebuje. Z niektórymi technikami kompilacji / parsowania możesz nawet stworzyć narzędzie, które zrobi to automatycznie. Jeśli przynajmniej weźmiesz to pod uwagę, możesz upewnić się, że rozumiesz wszystko, co mówi ten plik kodu.

A teraz zastanów się, czy otrzymałeś plik .cs z 1000 usingdyrektyw, z których faktycznie użyto tylko 10. Ilekroć spojrzysz na symbol, który został niedawno wprowadzony w kodzie, który odnosi się do świata zewnętrznego, będziesz musiał przejść przez te 1000 linii, aby dowiedzieć się, co to jest. To oczywiście spowalnia powyższą procedurę. Więc jeśli możesz je zmniejszyć do 10, to pomoże!

Moim zdaniem usingdyrektywa C # jest bardzo, bardzo słaba, ponieważ nie można określić pojedynczego symbolu ogólnego bez utraty generyczności i nie można użyć usingdyrektywy aliasu, aby użyć metod rozszerzających. Inaczej jest w przypadku innych języków, takich jak Java, Python i Haskell, w tych językach możesz określić (prawie) dokładnie to, czego chcesz od świata zewnętrznego. Ale w takim razie zasugeruję używanie usingaliasu, gdy tylko będzie to możliwe.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.