私はC#言語についてもっと学ぼうとしていますが、
using someOtherName = System.Timers.Timer;
言語を理解することにより混乱を招くだけのように思えます。誰か説明してください。
ありがとう
それは名前空間のエイリアスではなく、タイプのエイリアスです。曖昧さをなくすと便利です-たとえば、以下に対して:
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) { }
}
}
競合するサブ名前空間やオブジェクト名を持つ複数の名前空間がある場合に使用します[例として]
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();
入力する手間が省け、コードを読みやすくするために使用できます。
前述の例に加えて、ジェネリック型を繰り返し参照する場合は、(名前空間エイリアスではなく)型エイリアスが便利です。
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) {}
簡潔。
型名を共有する名前空間を明確にする利点はありますが、本質的には単なる糖です。
私はいつもこのような状況でそれを使用します
using Utility = MyBaseNamespace.MySubNamsepace.Utility;
ここで、Utility
は別のコンテキスト(MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility
など)を持ちますが、Utility
は常にその特定のクラスを指すことが期待/優先されます。
含まれる複数の名前空間に同じ名前のクラスが複数ある場合に非常に便利です。例えば...
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();
すべてのネームスペースに対してネームスペースエイリアスを定義しました。これにより、クラスの由来を非常に簡単に確認できます。例:
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つの方法では、Visual Studioでコーディングする際に非常に便利です。
Use-case:いくつかのクラスのみを使用する必要があるとしましょう。 SqlConnection
名前空間からSystem.Data
。通常のコースでは、以下に示すように、*。csファイルの上部にSystem.Data.SqlClient
名前空間をインポートします。
using System.Data;
今、私のインテリセンスを見てください。コードエディターでの入力中に選択できるクラスが非常に多くなり、大幅に増加しています。クラス全体をまったく使用しません。
したがって、*。csファイルの先頭でエイリアスを使用して、明確なインテリセンスビューを取得します。
using SqlDataCon = System.Data.SqlClient.SqlConnection
次に、私のインテリセンスビューを見てください。それは非常に透明で非常にきれいです。
私が知っている一つの理由。インポートされた名前空間から名前の衝突がある場合、短い名前を使用できます。例:
ModifierKeys
にアクセスするときに同じファイルでusing System.Windows.Forms;
とusing System.Windows.Input;
を宣言した場合、名前ModifierKeys
がSystem.Windows.Forms.Control
の両方にあることがわかります。およびSystem.Windows.Input
名前空間。したがって、using Input = System.Windows.Input;
を宣言することにより、System.Windows.Input.ModifierKeys
経由でInput.ModifierKeys
を取得できます。
私はC#バフではありませんが、名前空間のエイリアスは「ベストプラクティス」のように思えます。そうすれば、何を取得しているのかを把握でき、それ以上入力する必要はありません。
エイリアスは単体テストで非常に役立ちます。単体テストを作成する場合、テストするサブジェクトを次のように宣言するのが一般的です。
MyClass myClassUT;
myClassUT
件名[〜#〜] u [〜#〜] nder [〜#〜] t [〜#〜] estしかし、静的メソッドを使用して静的クラスの単体テストを作成する場合はどうでしょうか?次に、次のようなエイリアスを作成できます。
using MyStaticClassUT = Namespace.MyStaticClass;
次に、ユニットテストを次のように記述できます。
public void Test()
{
var actual = MyStaticClassUT.Method();
var expected = ...
}
そして、被験者が何であるかを決して見失うことはありません。