2017-05-31 18 views
1

私はアセンブリ内にstring拡張メソッドをいくつか持っていますA。アセンブリBでは、using AディレクティブをアセンブリのBの各.csファイルに追加しない限り、これらの拡張メソッドを使用できません。 Bアセンブリプロジェクトの設定で、アセンブリ全体の使用を指定する方法はありますか? C++ stdafx.hディレクティブを使用してアセンブリスコープを指定することはできますか?

に似たおかげ

+0

いいえ、すべてのソース・コード・ファイルは、他のメンバーと型にアクセスするために、独自の 'usings'を必要とします名前空間。少なくともこの意味ではなく、C++のようにすべてのリファレンスを公開するためのグローバルヘッダーはありません。これにより、特定のファイルに対してどの依存関係が存在するかを直接確認できるため、メンバーが定義されている場所を簡単に確認できます。 – HimBromBeere

+0

私はVBのプロジェクトのインポートについて言及するつもりでした(@ Damienの[answer](https://stackoverflow.com/a/44287428/2226988)を参照)。それらをすべて削除し、各ファイルで、そのファイルに必要なImportsディレクティブだけを入れます。良いIDEはハウスキーピングを助け、コードはそれが意味することを言います。 –

+0

@Tom、私は同意しますが、IDEは、あなたの拡張メソッドがどのクラスであるかのようなアセンブリを検出しません。 – Goldorak84

答えて

2

usingには、名前空間が含まれていますが、アセンブリではありません。名前空間がアセンブリと同じ名前を持つ必要はありません(共通の規約であっても)。

一般的な機能を表すため、すべてのアセンブリに文字列拡張を含めるのが当然の場合は、トップレベルの名前空間に入れてください。 MyCompanyName.MyApplication。これらは、同じまたは子の名前空間内の他のクラスのスコープに含まれます。

(これは、すべての名前空間が共通のルートなどMyCompanyName...から下降の一般的な慣行に従うことを前提としていない。)

+0

これは大変です。私は、トップレベルの名前空間(例えば、 'MyCompanyName.MyApplication'の中の' MyCompanyName')が含まれているとは思っていませんでした。ありがとう! – Goldorak84

+0

アセンブリーとネームスペースを明確にすることは良いことですが、私はあなたがそれを逆に述べたと思います。アセンブリーでは、アセンブリーとルート名を共有する名前空間を持つ_some_タイプを持つのが一般的です。アセンブリの後にアセンブリのマニフェストファイル(DLLなど)の名前を付けることもできます。そのため、[docs](https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext (v = vs.110).aspx)は、型を記述する際にすべての細部を持っています)。 –

+0

@TomBlodgetはい、そうです。私はそれを簡潔にする方法をかなり考えることはできませんが、あなたができると思えば自由に編集することができます。 –

1

using彼らの完全修飾名で参照するクラスや他の他の構成要素を避けるために、現在のコンテキストに名前空間をインポートします。

アセンブリBの1つの名前空間にすべての構造体を配置することはできますが、それではusingが1つだけ必要です。あなたのアセンブリBに含まれるものに応じて、あなたの文字列拡張関数はおそらく同じ名前空間に置くことができます(モデルのような他のものは別々のものになります)。それはまともな組織のようだ。

これらの拡張機能はすべて別々の.csファイルにあり、同じ名前空間にあることがありますので、すべてをインポートするには1つのusing宣言が必要です。

など。

ExtensionA.cs

namespace AssemblyB.Strings.Extensions 
{ 
    public static string ExtensionA(this string source, ...) {...} 
} 

ExtensionB.cs

namespace AssemblyB.Strings.Extensions 
{ 
    public static string ExtensionB(this string source, ...) {...} 
} 

ExtensionC.cs

namespace AssemblyB.Strings.Extensions 
{ 
    public static string ExtensionC(this string source, ...) {...} 
} 

AssemblyA.cs

using AssemblyBStrings.Extensions; 

    ... 
    var b = "Hello World".ExtensionA().ExtensionB().ExtensionC(); 
+0

実際、私の拡張はすでに同じアセンブリと名前空間にあります。私が取り除こうとしているのは、各.csファイルに 'using'ディレクティブを追加する必要があるということです。私はこれらの拡張機能を認識しているので開発中ですが、必ずしもすべての同僚ではありません – Goldorak84

+1

Damienの答えによると、そのような特徴があると信じていない。つまり、RedGateのReSharperはそれを支援し、自動的に使用します。したがって、これが開発者の利便性の問題であれば、それはあなたのために、もちろん$のためにそれを行います。 – LB2

2

いいえ、現在このような機能はありません。

アセンブリ/プロジェクトレベルでサポートされている機能を確認するには、コマンドラインコンパイラのヘルプを参照してください。

Visual Basicでは、Importステートメントは、C#にusingディレクティブがあるのと同じ方法で使用され、Project Importsという概念を持ちます。我々はvbc /?の出力を見たときに、確かに、私たちは見ることができます:

        - LANGUAGE - 

/define:<symbol_list>    Declare global conditional compilation 
            symbol(s). symbol_list:name=value,... 
            (Short form: /d) 
/imports:<import_list>   Declare global Imports for namespaces in 
            referenced metadata files. 
            import_list:namespace,... 
/langversion:<number>    Specify language version: 
            9|9.0|10|10.0|11|11.0|12|12.0|14|14.0 
/optionexplicit[+|-]    Require explicit declaration of variables. 
/optioninfer[+|-]     Allow type inference of variables. 
/rootnamespace:<string>   Specifies the root Namespace for all type 
            declarations. 
/optionstrict[+|-]    Enforce strict language semantics. 
/optionstrict:custom    Warn when strict language semantics are not 
            respected. 
/optioncompare:binary    Specifies binary-style string comparisons. 
            This is the default. 
/optioncompare:text    Specifies text-style string comparisons. 

そして、我々は/importsオプションがあることがわかります。我々はcsc /?の同等のセクションを見れば

は、我々は、次を参照してください。

     - LANGUAGE - 
/checked[+|-]     Generate overflow checks 
/unsafe[+|-]     Allow 'unsafe' code 
/define:<symbol list>   Define conditional compilation symbol(s) (Short 
           form: /d) 
/langversion:<string>   Specify language version mode: ISO-1, ISO-2, 3, 
           4, 5, 6, or Default 

そして、私たちは何も同等/using//usingsがないことがわかります。これから、C#コンパイラにusingディレクティブのセットを通知してアセンブリをコンパイルするときにすべてのファイルに適用する方法はないことを推測できます。

+0

VBには含まれていたが、C#には含まれていないというのは奇妙なことです。ありがとう! – Goldorak84

関連する問題