C # 네임 스페이스 별칭-요점은 무엇입니까?


95

언제 어디서나 다음과 같은 네임 스페이스 별칭을 사용할 것입니다.

 using someOtherName =  System.Timers.Timer;

그것은 언어를 이해하는 데 더 많은 혼란을 더할 것 같습니다.


6
using int = System.Int32C # 의 시스템 전체 는 어떻습니까? 유용하지 않습니까? 다른 곳에서 활용할 수있는 동일한 용도입니다.
— nawfal 2013 년

@nawfal 유형 별칭을 내보낼 수 없다고 생각합니다. 과 같은 것을 정의 할 수 없으며 using int = System.Int32선언 파일 이외의 장소에서 사용할 수 없음을 의미 합니다. 이 그래서 int에 Int32별칭 중 하나를 다른 수단에 의해 달성, 또는 컴파일러 / 런타임에 특별한 일이 될 수 있습니다.
— KFL

1
@KFL은 사실이지만 둘 다 제공하는 이점은 동일한 특성입니다.
— nawfal

1
@nawfal에 대한 귀하의 주장은 using int = System.Int32잘못되고 오해의 소지가 있습니다. int별칭이 설명 한 방식으로 구현되지 않았기 때문에 잘못되었습니다 . 이 유형의 별칭은 전 세계적으로 사용할 수있는 의미 때문에 얼마나로, 오해의 소지 int를 통해 사용됩니다 Int32.
— KFL

2
@KFL 나는 둘 다 암시하지 않았습니다. 유형에 대한 사용자 지정 이름이 유용한 이유를 방금 설명했습니다.
— nawfal

답변:


151

이는 네임 스페이스 별칭이 아니라 형식 별칭입니다. 예를 들어 다음과 같이 명확하게하는 것이 유용합니다.

using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;

(ps : Timer;-p를 선택해 주셔서 감사합니다 )

그렇지 않으면, 당신은 모두를 사용하는 경우 System.Windows.Forms.Timer와 System.Timers.Timer동일한 파일에 당신은 전체 이름 (때문에주는 유지해야 할 것 Timer혼동 될 수있다).

또한 extern다른 어셈블리의 동일한 정규화 된 형식 이름을 가진 형식을 사용하기위한 별칭이 있는 역할도합니다. 드물지만 지원하면 유용합니다.


실제로 다른 용도를 볼 수 있습니다. 유형에 대한 빠른 액세스를 원하지만 using충돌하는 확장 메서드를 가져올 수 없기 때문에 일반을 사용하고 싶지 않을 때 ... 약간 복잡하지만 ... 여기에 예가 있습니다. ...

namespace RealCode {
    //using Foo; // can't use this - it breaks DoSomething
    using Handy = Foo.Handy;
    using Bar;
    static class Program {
        static void Main() {
            Handy h = new Handy(); // prove available
            string test = "abc";            
            test.DoSomething(); // prove available
        }
    }
}
namespace Foo {
    static class TypeOne {
        public static void DoSomething(this string value) { }
    }
    class Handy {}
}
namespace Bar {
    static class TypeTwo {
        public static void DoSomething(this string value) { }
    }
}

8
네임 스페이스 또는 유형 이름의 별칭을 지정하는 데 사용할 수 있습니다.
— Sean Bright

1
@Sean : 예,하지만 주어진 예는 유형에 대한 것이 었습니다
— Marc Gravell

@lupefiasco : 영업 편리하게 선택할 수 System.Timers.Timer;-p
— 마크 Gravell

아, 구체적인 예가 아니라 개념을 언급하고 있다고 생각했습니다. Mea culpa.
— Sean Bright

26

충돌하는 하위 네임 스페이스 및 / 또는 개체 이름이있는 여러 네임 스페이스가있을 때 사용합니다. [예시로]와 같은 작업을 수행 할 수 있습니다.

using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;

...

src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();

그렇지 않으면 작성해야 할 것입니다.

Namespace1.Subspace.DataAccessObjects.DataObject source = 
  new Namespace1.Subspace.DataAccessObjects.DataObject();

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
  new Namespace2.Subspace.DataAccessObjects.DataObject();

그것은 많은 타이핑을 절약하고 코드를 훨씬 더 읽기 쉽게 만드는 데 사용할 수 있습니다.


17

언급 된 예제 외에도 제네릭 유형을 반복적으로 참조 할 때 유형 별칭 (네임 스페이스 별칭이 아닌)이 유용 할 수 있습니다.

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}

대:

using FooDict = Dictionary<string, SomeClassWithALongName>;

FooDict foo = new FooDict();

private void DoStuff(FooDict dict) {}

8

짧음.

유형 이름을 공유하는 네임 스페이스간에 명확성을 제공하는 부가적인 이점이 있지만 본질적으로 그것은 단지 설탕 일뿐입니다.


사용중인 기호를 명확하게 보여줍니다. 단지 설탕이 아니라 약간 장황합니다 (새 이름을 정의하고 싶지 않은 경우).
— Earth Engine

7

이런 상황에서 항상 사용합니다

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

여기서 Utility, 그렇지 않으면 (같은 다른 컨텍스트를 것 MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility),하지만 난 기대 / 선호 Utility하는 하나 개의 특정 클래스에 항상 점.


6

포함 된 여러 네임 스페이스에 동일한 이름을 가진 여러 클래스가있는 경우 매우 유용합니다. 예를 들면 ...

namespace Something.From.SomeCompanyA {
    public class Foo {
        /* ... */
    }
}

namespace CompanyB.Makes.ThisOne {
    public class Foo {
        /* ... */
    }
}

별칭을 사용하여 컴파일러를 행복하게 만들고 자신과 팀의 다른 사람들에게 더 명확한 정보를 제공 할 수 있습니다.

using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;

/* ... */

CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();

3

모든 네임 스페이스에 대해 네임 스페이스 별칭을 정의했습니다. 이렇게하면 클래스의 출처를 매우 쉽게 알 수 있습니다. 예 :

using System.Web.WebControls;
// lots of other using statements

// contains the domain model for project X
using dom = Company.ProjectX.DomainModel; 
// contains common web functionality
using web = Company.Web;
// etc.

과

// User from the domain model
dom.User user = new dom.User(); 
// Data transfer object
dto.User user = new dto.User(); 
// a global helper class
utl.SomeHelper.StaticMethod(); 
// a hyperlink with custom functionality
// (as opposed to System.Web.Controls.HyperLink)
web.HyperLink link = new web.HyperLink(); 

별칭의 이름을 지정하고 모든 사람이 사용하는 방법에 대한 몇 가지 지침을 정의했습니다.


1
별칭이 객체의 물리적 위치보다 사용되는 컨텍스트와 더 관련이 있다는 사실을 알지 못하십니까?
— BenAlabaster 2009

2

단위 테스트에서 별칭이 매우 유용하다고 생각합니다. 단위 테스트를 작성할 때 테스트 할 주제를 다음과 같이 선언하는 것이 일반적입니다.

MyClass myClassUT;

인 myClassUT주제 U 파인더 T의 정적 방법과 정적 클래스에 대한 쓰기 단위 테스트하려는 경우 추정. 그러나? 그런 다음 다음과 같은 별칭을 만들 수 있습니다.

using MyStaticClassUT = Namespace.MyStaticClass;

그런 다음 다음과 같이 단위 테스트를 작성할 수 있습니다.

public void Test()
{
    var actual = MyStaticClassUT.Method();
    var expected = ...
}

그리고 당신은 테스트 대상이 무엇인지 결코 놓치지 않습니다.


2

어떤면에서는 Visual Studio에서 코딩하는 동안 정말 편리합니다.

사용 사례 : 예 SqlConnection를 들어 네임 스페이스에서 몇 개의 클래스 만 사용했다고 가정 해 보겠습니다 System.Data. 일반적인 과정에서는 System.Data.SqlClient아래와 같이 * .cs 파일의 맨 위에 네임 스페이스를 가져옵니다 .

using System.Data;

이제 내 지능을보세요. 코드 편집기에서 입력하는 동안 선택할 수있는 많은 클래스로 크게 확산되었습니다. 나는 모든 클래스를 전혀 사용하지 않을 것입니다.

여기에 이미지 설명 입력

따라서 * .cs 파일 상단에 별칭을 사용하고 명확한 인텔리전스 뷰를 얻습니다.

using SqlDataCon = System.Data.SqlClient.SqlConnection

이제 내 지능적인 관점을보십시오. 그것은 매우 깨끗하고 매우 깨끗합니다.

여기에 이미지 설명 입력


1

내가 아는 한 가지 이유는 가져온 네임 스페이스에서 이름 충돌이있을 때 더 짧은 이름을 사용할 수 있습니다. 예:

당신이 선언 된 경우 using System.Windows.Forms;와 using System.Windows.Input; 동일한 파일에 액세스에 갈 때 ModifierKeys당신은 이름이 사실을 발견했습니다 ModifierKeys모두에 System.Windows.Forms.Control와 System.Windows.Input네임 스페이스. 선언에 의한 그래서 using Input = System.Windows.Input;당신은 다음 얻을 수 있습니다 System.Windows.Input.ModifierKeys통해 Input.ModifierKeys.

나는 C # 버프는 아니지만 별칭 네임 스페이스는 나에게 "최상의 사례"처럼 보인다. 이렇게하면 무엇을 받고 있는지 알면서도 너무 많이 입력 할 필요가 없습니다.


1

이를 사용하여 코드를 매우 쉽게 수정할 수 있습니다.

예를 들면 :

#if USE_DOUBLES
using BNumber = System.Double;
#else
using BNumber = System.Single;
#endif

public void BNumber DoStuff(BNumber n) {
    // ...
}
public void BNumber DoStuff2(BNumber n) {
    // ...
}
public void BNumber DoStuff3(BNumber n) {
    // ...
}

지시문을 간단히 변경하여 전체 코드가 float또는 에서 작동하는지 결정할 수 있습니다 double.

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