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


95

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

 using someOtherName =  System.Timers.Timer;

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


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

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