C #에서 사용하지 않는 using 지시문을 제거하는 이유는 무엇입니까?


120

개발자 Usings가 Visual Studio 2008에서 " 사용하지 않는 항목 제거 "기능을 사용하는 이유 (소스 코드 정리를 제외하고)가 있는지 궁금합니다 .


저는 이것이 Visual Studio 자체가 아니라 Visual Studio 용 PowerCommands의 기능이라고 생각합니다.
Hosam Aly

3
VS2008에서는 확실히 VS 자체의 기능 (using 문을 정렬하는 기능과 함께)입니다.
리처드

1
@Hosam : PowerCommands를 사용하면 전체 프로젝트 / 솔루션에 대해이를 수행 할 수 있습니다. 파일 단위로 수행하는 것은 VS 자체의 기능입니다.
컨 피규 레이터

3
BTW, 이러한 종류의 정리를 더 정확하게 제어하려면 Resharper를 확인하십시오.
John Feminella

2
저는이 기능이 정말 마음에 들지 않습니다. 저는 항상 파일을 편집하고 누군가가 파일을 정리 한 후에 모든 시스템 네임 스페이스를 다시 추가해야한다는 것을 알게되었습니다 (보통 System, System.Collections.Generic 및 System.Linq). 절약하는 것보다 더 많은 마찰. 이제 프레임 워크 네임 스페이스가 아닌 자체 프로젝트 네임 스페이스를 정리하고 프로그램 연결을 명확히하는 것이 더 합리적입니다. VS가 특정 네임 스페이스에서만 가져 오기를 정리하고 더 자주 필요한 시스템은 그대로 두는 방법이 있었으면합니다.
user1454265

답변:


186

그들을 꺼내고 싶은 몇 가지 이유가 있습니다.

  • 무의미합니다. 그들은 가치를 추가하지 않습니다.
  • 혼란 스럽습니다. 해당 네임 스페이스에서 무엇을 사용하고 있습니까?
  • 그렇지 않으면 using시간이 지남에 따라 코드가 변경됨에 따라 점차적으로 무의미한 진술이 축적 됩니다.
  • 정적 분석이 더 느립니다.
  • 코드 컴파일이 느립니다.

다른 한편으로, 그것들을 남겨 둘 이유는 많지 않습니다. 나는 당신이 그들을 삭제해야하는 노력을 절약했다고 ​​생각합니다. 그러나 당신이 그렇게 게으르다면 더 큰 문제가 있습니다!


59
좋은 프로그래머는 게으르고하지 말아야 할 일을 최대화합니다. : D
Nicolas Dorier 2009

34
나는 좋은 프로그래머가 게으르다는 것에 동의하지 않지만 당신의 진술에 동의합니다. 좋은 프로그래머는 코드를 삭제하여 코드를 깨끗하게 유지하여 향후 작업 / 문제 / 문제를 방지 할 수 있습니다.
Allan

2
맞습니다. 훌륭한 링크입니다. 내 요점은 우리가 "나쁜 게으른"보다는 "좋은 게으른"을 원한다는 것입니다. 후자는 프로그래머가 좋은 코드를 작성하는 데 방해가되지 않는 곳입니다.
Allan

5
표준 네임 스페이스를 그대로 두는 것도 장점이 있습니다. 대규모 프로젝트와 팀에서이를 그대로두면 잠재적 인 병합 충돌이 줄어들고 코드 검토를위한 파일이 줄어 듭니다. 또한 많은 개발자가 혼란스럽고 찾기 어려운 확장 메서드를 추가하고 때로는 이러한 확장 메서드에 필요한 네임 스페이스를 찾는 것이 번거 롭습니다. 새로운 개발자는 System.Linq를 코드 파일에 포함하는 데 익숙 할 수 있으며 도움을 요청하기 전에 특정 메서드를 사용할 수없는 이유를 파악하는 데 많은 시간을 낭비 할 수 있습니다.
Mark At Ramp51 2014 년

5
향후 코딩에서 인텔리 센스가 지옥처럼 멍청 해지는 것을 방지하기 위해 일부를 유지하고 싶을 수도 있습니다.
yazanpro 2014 년

24

나는 그 반대라고 말하고 싶습니다. 불필요하고 불필요한 using 문을 제거하는 것은 매우 도움이됩니다.

3, 6, 9 개월 내에 코드로 돌아 가야하거나 다른 사람이 코드를 인계 받아 유지해야한다고 상상해보십시오.

정말로 필요하지 않은 using 문에 대한 방대한 양의 세탁 목록이 있다면 코드를 보는 것이 매우 혼란 스러울 수 있습니다. 그 네임 스페이스에서 아무것도 사용되지 않는다면 왜 거기에서 사용하고 있습니까 ??

전문적인 환경에서 장기적인 유지 관리 측면에서 코드를 가능한 한 깨끗하게 유지하는 것이 좋습니다. 여기에는 불필요한 내용을 버리는 것도 포함됩니다. 덜 혼란 스러울수록 혼란이 적어 유지 보수 가능성이 높아집니다.

마크


14

이것은 응답하는 사람들에 의해 상당히 경솔한 방식으로 취급되고있는 매우 합리적인 질문 인 것 같습니다.

소스 코드에 대한 모든 변경은 정당화되어야한다고 말하고 싶습니다. 이러한 변경에는 숨겨진 비용이있을 수 있으며 질문을 제기 한 사람은이를 알고 싶어했습니다. 그들은 한 사람이 움직이는 것처럼 "게으른"이라고 부르지 않았습니다.

방금 Resharper를 사용하기 시작했으며 내가 담당하는 프로젝트에 대한 경고와 스타일 힌트를주기 시작했습니다. 그중에는 중복 using 지시문을 제거하고 중복 한정자, 대문자 사용 등을 제거하는 것입니다. 내 직감은 코드를 정리하고 모든 힌트를 해결하는 것이지만, 비즈니스 책임자는 부당한 변경에 대해 경고합니다.

우리는 자동화 된 빌드 프로세스를 사용하므로 SVN 리포지토리를 변경하면 프로젝트 / 버그 / 이슈에 연결할 수없는 변경 사항이 생성되고 이전 버전에 기능적 변경 사항이없는 자동화 된 빌드 및 릴리스가 트리거됩니다.

중복 한정자의 제거를 살펴보면 도메인 및 데이터 계층 클래스가 한정자에 의해서만 구분되므로 개발자에게 혼란을 줄 수 있습니다.

애칭 (예 : ABCD-> Abcd)의 적절한 대소 문자 사용을 살펴보면 Resharper가 해당 참조 클래스 이름을 사용하는 Xml 파일을 리팩터링하지 않는다는 점을 고려해야합니다.

따라서 이러한 힌트를 따르는 것은 보이는 것처럼 간단하지 않으며 존경심을 가지고 대해야합니다.


6
좋은 지적이지만, 깔끔하고 복잡하지 않은 코드를 관리하면 비즈니스 목표이기도 한 유지 관리 가능성이 향상된다는 사실을 잊지 말아야합니다. 두 가지 모두에 무게를 두어야합니다. 이상적으로는 릴리스 직후에 이러한 종류의 리팩토링을 수행하여 가능한 한 깔끔하게 새로 시작하고 최종 회귀를 포착 할 충분한 시간을 가질 수 있도록하는 것이 좋습니다.
David Reis

14

이미 주어진 이유 외에도 불필요한 이름 충돌을 방지합니다. 다음 파일을 고려하십시오.

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

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

네임 스페이스 System.IO 및 System.Windows.Shapes에는 각각 Path라는 클래스가 포함되어 있으므로이 코드는 컴파일되지 않습니다. 전체 클래스 경로를 사용하여 수정할 수 있습니다.

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

또는 단순히 줄을 제거 할 수 있습니다 using System.Windows.Shapes;.


13

Intellisense 팝업의 옵션이 적습니다 (특히 네임 스페이스에 확장 메서드가 많이 포함 된 경우).

이론적으로 Intellisense도 더 빨라야합니다.


1
intellisense의 경우 +1. 실제로 시작시 느리기 때문에 (정기적으로 "캐시 빌드 중, 나중에 다시 시도"가 표시됨) 이는 실제로 중요 할 수 있습니다. 다른 사람들이 말하는 시간을 모 으세요 ... 아직 숫자를 보지 못했습니다.
Luc

5

그들을 제거하십시오. 보고 궁금해 할 코드가 적 으면 시간과 혼란이 절약됩니다. 더 많은 사람들이 모든 것을 단순하고 깔끔하고 깔끔하게 유지하기를 바랍니다. 방에 더러운 셔츠와 바지가있는 것과 같습니다. 추악하고 왜 거기에 있는지 궁금해해야합니다.


4

또한 사용하지 않는 사용을 제거한 후 프로젝트에서 일부 dll / 프로젝트 참조를 제거 할 수 있다고 가정하면 잘못된 순환 종속성을 방지하는 데 도움이됩니다.


3

코드가 더 빨리 컴파일됩니다.


5
그것을 뒷받침 할 증거가 있습니까?
cjk

14
오 CK-또 나를 잡았어. 나는 거짓말했다. 불필요한 텍스트를 제거하면 실제로 코드 컴파일 속도가 느려집니다. 그것에 대해 생각하십시오 :)
죽은 계정

@ck : 작업중인 프로젝트에서 사용하지 않는 using 문을 제거하면 컴파일 시간이 눈에 띄게 향상되었음을 확인했습니다. 물론 하드 드라이브에서 읽을 바이트 수가 적습니다.
피규

19
실제 통계를 보면 좋을 것입니다. 컴파일하는 동안 몇 밀리 초 만 절약한다면 속도는 설득력이 없습니다. 그러나 불필요한 using 문을 제거하는 다른 이유가 있습니다.
Greg

3
거짓말에 관한 것이 아닙니다. 현명한 사람들은 어수선 함이 적다는 것은 효율성이 높다는 것을 의미한다고 추측 할 것입니다. 이를 뒷받침하는 "증거"는 응답에 가치를 제공하고 "더 빠름"이 단지 몇 ms를 의미하는 것이 아니라 실제로 프로젝트를 더 빨리 컴파일 할 수있는 향상된 경험이라는 주장을 뒷받침하는 것입니다.
마테우스 펠리페

3

최근에 사용하지 않는 수입품을 삭제하는 것이 매우 유용하고 중요한 또 다른 이유를 얻었습니다.

하나가 다른 하나를 참조하는 두 개의 어셈블리가 있다고 가정합니다 (지금은 첫 번째 어셈블리를 A 하고 참조 B)를. 이제 A에 B에 의존하는 코드가 있으면 모든 것이 정상입니다. 그러나 개발 프로세스의 어느 단계에서 실제로 해당 코드가 더 이상 필요하지 않다는 것을 알게되었지만 using 문은 그대로 둡니다. 이제뿐만 아니라는 의미가 using-directive뿐만 아니라, 어셈블리 참조B임의의 장소에서 사용하지 않는하지만 사용되지 않는 지시어에 있습니다. 이것은 먼저 컴파일에 필요한 시간을 늘립니다 A.B 또한로드 할 수 있습니다.

따라서 이것은 더 깔끔하고 읽기 쉬운 코드에 대한 문제 일뿐만 아니라 참조 된 어셈블리가 모두 존재 하지 않는 프로덕션 코드에서 어셈블리 참조를 유지하는 문제이기도 합니다 .

마지막으로 예제에서 B와 A를 함께 배송해야했지만 B는 A의 어느 곳에서도 사용되지 않고-섹션에서 사용되었습니다 using. 이 다량으로 영향을 미칠 것이다 런타임 의 - 성능A 어셈블리를 로드 .


2

적어도 이론적으로는 C # .cs 파일 (또는 단일 프로그램 소스 코드 파일)이 제공된 경우 코드를보고 필요한 모든 것을 시뮬레이션하는 환경을 만들 수 있어야합니다. 일부 컴파일 / 파싱 기술을 사용하면 자동으로 수행하는 도구를 만들 수도 있습니다. 이 작업을 최소한 염두에두고 수행하면 코드 파일이 말하는 모든 내용을 이해할 수 있습니다.

이제 1000이 포함 된 .cs 파일을받은 경우 using 실제로 10 개만 지시문이 . 외부 세계를 참조하는 코드에 새로 도입 된 기호를 볼 때마다 1000 줄을 거쳐야합니다. 이것은 분명히 위의 절차를 느리게합니다. 따라서 10 개로 줄일 수 있다면 도움이 될 것입니다!

제 생각에는 C # using지시문은 매우 약합니다. 일반성을 잃지 않고는 단일 제네릭 기호를 지정할 수없고 using별칭 지시문을 사용하여 확장 메서드를 사용할 수 없기 때문 입니다. Java, Python 및 Haskell과 같은 다른 언어에서는 그렇지 않습니다. 이러한 언어에서는 외부 세계에서 원하는 것을 (거의) 정확하게 지정할 수 있습니다. 그러나 이벤트는 using가능할 때마다 별칭 을 사용하는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.