web-dev-qa-db-ja.com

C#名前空間エイリアス-ポイントは何ですか?

私はC#言語についてもっと学ぼうとしていますが、

 using someOtherName =  System.Timers.Timer;

言語を理解することにより混乱を招くだけのように思えます。誰か説明してください。

ありがとう

87
Brad

それは名前空間のエイリアスではなく、タイプのエイリアスです。曖昧さをなくすと便利です-たとえば、以下に対して:

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) { }
    }
}
142
Marc Gravell

競合するサブ名前空間やオブジェクト名を持つ複数の名前空間がある場合に使用します[例として]

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();

入力する手間が省け、コードを読みやすくするために使用できます。

25
BenAlabaster

前述の例に加えて、ジェネリック型を繰り返し参照する場合は、(名前空間エイリアスではなく)型エイリアスが便利です。

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) {}
17
Joel Mueller

簡潔。

型名を共有する名前空間を明確にする利点はありますが、本質的には単なる糖です。

8
annakata

私はいつもこのような状況でそれを使用します

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

ここで、Utilityは別のコンテキスト(MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utilityなど)を持ちますが、Utilityは常にその特定のクラスを指すことが期待/優先されます。

7
bdukes

含まれる複数の名前空間に同じ名前のクラスが複数ある場合に非常に便利です。例えば...

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();
5
Sean Bright

すべてのネームスペースに対してネームスペースエイリアスを定義しました。これにより、クラスの由来を非常に簡単に確認できます。例:

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(); 

エイリアスに名前を付ける方法と、すべての人がエイリアスを使用する方法のガイドラインを定義しました。

3
M4N

1つの方法では、Visual Studioでコーディングする際に非常に便利です。

Use-case:いくつかのクラスのみを使用する必要があるとしましょう。 SqlConnection名前空間からSystem.Data。通常のコースでは、以下に示すように、*。csファイルの上部にSystem.Data.SqlClient名前空間をインポートします。

using System.Data;

今、私のインテリセンスを見てください。コードエディターでの入力中に選択できるクラスが非常に多くなり、大幅に増加しています。クラス全体をまったく使用しません。

enter image description here

したがって、*。csファイルの先頭でエイリアスを使用して、明確なインテリセンスビューを取得します。

using SqlDataCon = System.Data.SqlClient.SqlConnection

次に、私のインテリセンスビューを見てください。それは非常に透明で非常にきれいです。

enter image description here

2
RBT

私が知っている一つの理由。インポートされた名前空間から名前の衝突がある場合、短い名前を使用できます。例:

ModifierKeysにアクセスするときに同じファイルでusing System.Windows.Forms;using System.Windows.Input;を宣言した場合、名前ModifierKeysSystem.Windows.Forms.Controlの両方にあることがわかります。およびSystem.Windows.Input名前空間。したがって、using Input = System.Windows.Input;を宣言することにより、System.Windows.Input.ModifierKeys経由でInput.ModifierKeysを取得できます。

私はC#バフではありませんが、名前空間のエイリアスは「ベストプラクティス」のように思えます。そうすれば、何を取得しているのかを把握でき、それ以上入力する必要はありません。

1
Zv_oDD

エイリアスは単体テストで非常に役立ちます。単体テストを作成する場合、テストするサブジェクトを次のように宣言するのが一般的です。

MyClass myClassUT;

myClassUT件名[〜#〜] u [〜#〜] nder [〜#〜] t [〜#〜] estしかし、静的メソッドを使用して静的クラスの単体テストを作成する場合はどうでしょうか?次に、次のようなエイリアスを作成できます。

using MyStaticClassUT = Namespace.MyStaticClass;

次に、ユニットテストを次のように記述できます。

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

そして、被験者が何であるかを決して見失うことはありません。

1
Charlie