すべき"を利用した指示する内外の名前空間?
-
02-07-2019 - |
質問
していました StyleCop あC#コードでの報告をする私 using
指令は内部の名前
が、技術的な理由から現在のところを、 using
指内部の代わりに外部の名前空間?
解決
が、実際には(微妙な差はない。たとえば、次のコードFile1.cs:
// File1.cs
using System;
namespace Outer.Inner
{
class Foo
{
static void Bar()
{
double d = Math.PI;
}
}
}
このことをいうファイル(File2.cs)のプロジェクトは以下のようなものです:
// File2.cs
namespace Outer
{
class Math
{
}
}
コンパイラの検索 Outer
前の見方 using
指以外の名前空間でできるようにするためのlibsoupおよ Outer.Math
の代わりに System.Math
.残念ながらそれとも幸い?), Outer.Math
ない PI
会員でFile1が破となりました。
この変更の場合は、 using
お名前空間宣言、
// File1b.cs
namespace Outer.Inner
{
using System;
class Foo
{
static void Bar()
{
double d = Math.PI;
}
}
}
現在のコンパイラの検索 System
前の検索 Outer
, を見つける System.Math
, すべて正することができます。
あいう Math
すが、悪名ユーザによって定義されたクラスであり、既に一 System
;ここがポイントであ は の違いが影響し、保守性のコードです。
でも興味深いこ Foo
ある名前空間 Outer
, よ Outer.Inner
.その場合、追加 Outer.Math
にFile2ブFile1に関わらず、 using
るにすぎないことが分かる。これは、このコンパイラの検索の最も奥深い名前空間を囲む前に見える任意の using
されております。
他のヒント
このスレッドはすでに一部の回答ができる気持ち、もう少し詳しくはこの追加の答えです。
第一に、覚えている名前空間宣言との間には、
namespace MyCorp.TheProduct.SomeModule.Utilities
{
...
}
は完全に相当す:
namespace MyCorp
{
namespace TheProduct
{
namespace SomeModule
{
namespace Utilities
{
...
}
}
}
}
また、入 using
指令のすべてのことです。(もちろん、私たちも背筋が伸びる思いでした using
sなんでもかんでも規則まみが、この法律によるとされたものの翻訳であります。)
のルールを解決するタイプを利用でき緩やかに記載のようになります: 最初の検索の最も"範囲"のための試合では、どうしてもヒットしない場合は、見つかりが出て一つのレベルの範囲で検索がで, までの一致が見られる。場合はある程度以上の数の一致が見つかったら、場合には、現在の組み立て、一つについては、コンパイラの警告が表示されます。その他、アップ(コンパイル時にエラー)。
それでは、それぞれ特徴、印象が異なるので明示的にかこのように具体例を二つの大きなコンベンションに出かけていく。
(1)usings外:
using System;
using System.Collections.Generic;
using System.Linq;
//using MyCorp.TheProduct; <-- uncommenting this would change nothing
using MyCorp.TheProduct.OtherModule;
using MyCorp.TheProduct.OtherModule.Integration;
using ThirdParty;
namespace MyCorp.TheProduct.SomeModule.Utilities
{
class C
{
Ambiguous a;
}
}
上記の場合、どのようなタイプ Ambiguous
は、検索性がありますので、この順:
- 入れ子の種類内
C
を含むを受け継い入れ子になった型) - 種類は現在の名前空間
MyCorp.TheProduct.SomeModule.Utilities
- 種名前空間
MyCorp.TheProduct.SomeModule
- 種類
MyCorp.TheProduct
- 種類
MyCorp
- 種類の nullの場合 名前空間のグローバル名前空間)
- 種類
System
,System.Collections.Generic
,System.Linq
,MyCorp.TheProduct.OtherModule
,MyCorp.TheProduct.OtherModule.Integration
, は、ThirdParty
その他の条
(2)usings内
namespace MyCorp.TheProduct.SomeModule.Utilities
{
using System;
using System.Collections.Generic;
using System.Linq;
using MyCorp.TheProduct; // MyCorp can be left out; this using is NOT redundant
using MyCorp.TheProduct.OtherModule; // MyCorp.TheProduct can be left out
using MyCorp.TheProduct.OtherModule.Integration; // MyCorp.TheProduct can be left out
using ThirdParty;
class C
{
Ambiguous a;
}
}
現在、検索の種類 Ambiguous
がこの順:
- 入れ子の種類内
C
を含むを受け継い入れ子になった型) - 種類は現在の名前空間
MyCorp.TheProduct.SomeModule.Utilities
- 種類
System
,System.Collections.Generic
,System.Linq
,MyCorp.TheProduct
,MyCorp.TheProduct.OtherModule
,MyCorp.TheProduct.OtherModule.Integration
, は、ThirdParty
- 種名前空間
MyCorp.TheProduct.SomeModule
- 種類
MyCorp
- 種類の nullの場合 名前空間のグローバル名前空間)
(ご注意 MyCorp.TheProduct
た"3."のために必要ないと"4."および"5.".)
最終発言
なだusings内外の名前空間宣言、ある人は後を追加し新しいタイプと同じ名前の名前空間をより高い優先されます。
また、入れ子の名前空間と同じ名前タイプで締め付けて感触をつかむことです。
いつも危険なのusingsの場所から別の場所での検索階層の変更、別のタイプがあります。そのため、選択条約であることにこだわり、ないもの移動usings.
Visual Studioのテンプレートは、デフォルトのusings 外部 の名前空間に(例えばだVSを新しく生成しますクラスファイルを保存し、新規ファイル).
ワン(小)とusings 外部 ことができるその活用のためのディレクグローバル属性、例えば [assembly: ComVisible(false)]
の代わりに [assembly: System.Runtime.InteropServices.ComVisible(false)]
.
その内の名前空間の宣言は地域にその名前空間のファイル(または複数の名前空間にまたがる名前のファイル)がいただけるお客様につ名前空間ファイルそのなのかどうかも内外の名前
using ThisNamespace.IsImported.InAllNamespaces.Here;
namespace Namespace1
{
using ThisNamespace.IsImported.InNamespace1.AndNamespace2;
namespace Namespace2
{
using ThisNamespace.IsImported.InJustNamespace2;
}
}
namespace Namespace3
{
using ThisNamespace.IsImported.InJustNamespace3;
}
による Hanselmanを用いたディレクティブと組み立て読み込み中... その他の記事が技術的に何も変わらないのです。
自分の好きにはたちに見てもらうとともに、社外の名前空間
によると、StyleCopドキュメンテーション
SA1200:UsingDirectivesMustBePlacedWithinnamespace
原因 C#用ディレクティブの外側に置いた名前空間を要素となります。
ルール説明 違反のこのルールが使用指令または利用-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
{
}
}
このコードはコンパイルできますがきれいになく、コンパイラエラー。しかし、があるのかどうかは不明であるオープンアクセスのガイドタイプが割り当てられます。場合には利用ディレクティブが移動中の名前空間は、下図のように、コンパイラエラーが発生します:
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.サンプルを含む定義に反しに"別名"Guid'
このコードを作成しエイリアスのシステム。Guidとよばれること、また独自に作タイプということで一致するコンストラクタをインターフェース。その後、コードのインスタンスを作成し、タイプガイド.をこのインスタンスのコンパイルを選択の異なる二つの定義のこと.の利用-aliasディレクティブの外側に置いたの名前空間の要素をコンパイラについては現地の定義ガイド内に記載されているローカルな名前空間は、完全に無視する用-aliasディレクティブの外部で定義された名前空間.この、残念ながら、しないことが明らかではないことを読み込む際にコードです。
の利用-aliasディレクティブにおける名前空間はコンパイラが選べると異なり、相反することで種類も定義の名前空間.いずれの種類をマッチングコンストラクタです。のコンパイラがとっては、このようなフラグのコンパイラエラーになります。
置を使用-aliasディレクティブ以外の名前空間の悪い方の練習できるので混乱した状況などこのでないことが明らかではないことのバージョンの種類は実際に使っています。ここで潜在的なバグが修正が難しい場合があります。診断.
を利用-エイリアス指令の名前空間の要素を排除す源としてございます。
- 複数の名前空間
を複数の名前空間要素の単一のファイルは一般的には悪いことだが、こうしたことを考慮することで、グが有効になっているかを当てるドキドキ感も楽しめる指令の名前空間要素により世界のトップにファイルです。この範囲の名前空間を緊密にし、もののような行動を記述する。
が重要である場合、多くの場合はコードを記述を用いた指の外側に置いたの名前空間に注意する必要があ居時にこれらのディレクティブの名前空間を確保することはな変化を意味します。として上記で説明を使用-エイリアス指令の名前空間要素でコンパイラーをお選びの間に矛盾する種類の方法でそのようなことは起こらなくな場合のディレクティブのリニューアルが入っているのnamespace.
どのように修正侵害 固定違反にこのルールを動き当てるドキドキ感も楽しめるディレクティブとその利用-エイリアス指令の名前空間要素になります。
ある問題を用計算書内の名前空間を使用する場合には別名になります。エイリアスさんからの using
績としては、十分ないようです。
発生していると考えること
namespace MyNamespace
{
using System;
using MyAlias = System.DateTime;
class MyClass
{
}
}
に対す:
using System;
namespace MyNamespace
{
using MyAlias = DateTime;
class MyClass
{
}
}
これが特に顕著な場合は冗長なエイリアスは、以下のようなるかせていただき、問題を発見):
using MyAlias = Tuple<Expression<Func<DateTime, object>>, Expression<Func<TimeSpan, object>>>;
と using
諸表の中の名前空間で急:
using MyAlias = System.Tuple<System.Linq.Expressions.Expression<System.Func<System.DateTime, object>>, System.Linq.Expressions.Expression<System.Func<System.TimeSpan, object>>>;
くない。
としてJeppe Stigニールセン 言, このスレッドでは答えが思ったことは明らかで繊細なった特筆す。
using
指定の内の名前空間が短縮コードにかかわしながら完全修飾している指定された。
次の例では、作品の種類 Foo
や Bar
の両方が同一のグローバル名前空間 Outer
.
推定のコードファイル Foo.cs:
namespace Outer.Inner
{
class Foo { }
}
や バーがあります。cs:
namespace Outer
{
using Outer.Inner;
class Bar
{
public Foo foo;
}
}
ることを省略でき、外側の名前空間の using
指令、短:
namespace Outer
{
using Inner;
class Bar
{
public Foo foo;
}
}
一つわかってし(なに覆われたその他の回答):
"ってこれらの名前空間にまたがる名前:
- い。その他
- Parent.い。その他
ご利用の際は using Something.Other
外部 の namespace Parent
, では、最初の(ょう。生成するための開発ツールです。
ただしご利用の場合で 内部 その名前空間宣言では、第一(Parent.い。その他)!
あのグループに参加"ボタン:追加の"global::
"プレフィックス: docs
namespace Parent
{
using global::Something.Other;
// etc
}
別の繊細させていただいて、その他の回答できないクラスと名前空間と同じ名前です。
る場合は、輸入の中の名前空間でのクラスです。場合には輸入する以外の名前空間の輸入は無視されますのクラスと名前空間を完全指定。
//file1.cs
namespace Foo
{
class Foo
{
}
}
//file2.cs
namespace ConsoleApp3
{
using Foo;
class Program
{
static void Main(string[] args)
{
//This will allow you to use the class
Foo test = new Foo();
}
}
}
//file2.cs
using Foo; //Unused and redundant
namespace Bar
{
class Bar
{
Bar()
{
Foo.Foo test = new Foo.Foo();
Foo test = new Foo(); //will give you an error that a namespace is being used like a class.
}
}
}
の技術上の理由から議論に答えると思うので、個人環境の設定は以降に差がないとのことで 大きな がトレードオフのためのものです。Visual Studioのデフォルトのテンプレートの作成 .cs
ファイルの利用 using
指令外の名前空間など
きを調整すstylecopチェック using
指令外の名前空間を追加 stylecop.json
ファイルのルートプロジェクトは以下の内容のファイル:
{
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"orderingRules": {
"usingDirectivesPlacement": "outsideNamespace"
}
}
}
を作成できますこのconfigファイルをソリューションレベルに追加してくださいプロジェクトとして、既存のリンクはファイル共有コンフィグのすべてのプロジェクトです。
ではより良い練習が デフォルト 使用する"参考文献"お客様にソリューションには外の名前空間とそう "新規追加参考" 良い練習がございますのでご注意下さいまの名前このと区別するか参考文献が追加される。