StyleCop 설명서에 따르면 :
SA1200 : 네임 스페이스에서 지시문 사용
원인 AC # using 지시문이 네임 스페이스 요소 외부에 배치되었습니다.
규칙 설명이 규칙의 위반은 파일에 네임 스페이스 요소가 포함되지 않은 경우 using 지시문 또는 using-alias 지시문이 네임 스페이스 요소 외부에 배치 될 때 발생합니다.
예를 들어 다음 코드는이 규칙을 두 번 위반합니다.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
그러나 다음 코드는이 규칙을 위반하지 않습니다.
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
이 코드는 컴파일러 오류없이 깨끗하게 컴파일됩니다. 그러나 어떤 버전의 Guid 유형이 할당되고 있는지 확실하지 않습니다. 아래와 같이 using 지시문을 네임 스페이스 내부로 이동하면 컴파일러 오류가 발생합니다.
namespace Microsoft.Sample
{
using Guid = System.Guid;
public class Guid
{
public Guid(string s)
{
}
}
public class Program
{
public static void Main(string[] args)
{
Guid g = new Guid("hello");
}
}
}
다음 컴파일러 오류로 인해 코드가 실패합니다. Guid g = new Guid("hello");
CS0576 : 네임 스페이스 'Microsoft.Sample'에 별칭 'Guid'와 충돌하는 정의가 포함되어 있습니다.
이 코드는 Guid라는 System.Guid 형식에 대한 별칭을 만들고 일치하는 생성자 인터페이스를 사용하여 Guid라는 자체 형식을 만듭니다. 나중에이 코드는 Guid 유형의 인스턴스를 만듭니다. 이 인스턴스를 만들려면 컴파일러가 Guid의 두 가지 다른 정의 중에서 선택해야합니다. using-alias 지시문이 namespace 요소 외부에 배치되면 컴파일러는 로컬 네임 스페이스 내에 정의 된 Guid의 로컬 정의를 선택하고 네임 스페이스 외부에 정의 된 using-alias 지시문을 완전히 무시합니다. 불행히도 이것은 코드를 읽을 때 분명하지 않습니다.
그러나 using-alias 지시문이 네임 스페이스 내에 있으면 컴파일러는 동일한 네임 스페이스 내에 정의 된 서로 상충되는 두 가지 Guid 유형 중에서 선택해야합니다. 이 두 유형 모두 일치하는 생성자를 제공합니다. 컴파일러가 결정을 내릴 수 없으므로 컴파일러 오류를 표시합니다.
using-alias 지시문을 네임 스페이스 외부에 배치하면 실제로 사용되는 유형의 버전이 확실하지 않은 상황에서 혼동을 일으킬 수 있으므로 나쁜 습관입니다. 이로 인해 잠재적으로 진단하기 어려운 버그가 발생할 수 있습니다.
네임 스페이스 요소 내에 using-alias 지시문을 배치하면이를 버그의 원인으로 사용할 수 없습니다.
- 여러 네임 스페이스
단일 파일 내에 여러 네임 스페이스 요소를 배치하는 것은 일반적으로 좋지 않은 방법이지만 이것이 완료되면 전역 적으로 파일의 맨 위가 아닌 각 네임 스페이스 요소 내에 모든 사용 지시문을 배치하는 것이 좋습니다. 이렇게하면 네임 스페이스의 범위가 좁아지고 위에서 설명한 동작을 피하는 데 도움이됩니다.
네임 스페이스 외부에있는 지시문을 사용하여 코드를 작성한 경우 네임 스페이스 내에서 이러한 지시문을 이동할 때 코드의 의미가 변경되지 않도록주의해야합니다. 위에서 설명한 바와 같이, 네임 스페이스 요소 내에 using-alias 지시문을 배치하면 컴파일러가 지시문이 네임 스페이스 외부에 배치 될 때 발생하지 않는 방식으로 충돌하는 유형 중에서 선택할 수 있습니다.
위반을 수정하는 방법이 규칙의 위반을 수정하려면 네임 스페이스 요소 내에서 using using 지시문과 using-alias 지시문을 모두 이동하십시오.