冗長な修飾子には欠点はありますか?何かメリットはありますか?

StackOverflow https://stackoverflow.com/questions/99299

質問

たとえば、単なる Datagrid ではなく、System.Data.Datagrid として何かを参照します。例と説明を教えてください。ありがとう。

役に立ちましたか?

解決

利点は、使用するものすべてにインポートを追加する必要がないことです。特に、特定の名前空間から使用するものだけがインポートである場合は、衝突も回避できます。

もちろん、欠点は、特定の修飾子を使用するほどコードのサイズが大きくなり、読みにくくなることです。

個人的には、コードの読みやすさに影響しないように、特定の名前空間からのものを 1 回か 2 回しか使用しないことが確実にわかっている場合を除き、ほとんどのことにインポートを使用する傾向があります。

他のヒント

参照している型について非常に明示的であり、それは利点です。ただし、同じプロセスでコードの明瞭さを放棄することになります。コードを読みやすく理解できるようにしたいので、これは私の場合明らかにマイナス面です。クラスを明示的に参照することでのみ解決できる、異なる名前空間での競合がない限り、私は短いバージョンを使用します。次のキーワードを使用してエイリアスを作成しない限り、次のようになります。

using Datagrid = System.Data.Datagrid;

実際にはフルパスは global::System.Data.DataGrid. 。より修飾されたパスを使用することのポイントは、特に別の using を導入すると型解決で問題が発生する場合に、追加の using ステートメントを使用する必要がなくなることです。明示的である必要がある場合に明示的にできるように、より完全修飾された識別子が存在しますが、クラスの名前空間が明確な場合は、 DataGrid バージョンの方が多くの人にとってわかりやすいです。

コードをできるだけクリーンで読みやすい状態に保つために、私は通常、利用可能な最も短い形式を使用します。結局のところ、これがディレクティブの使用の目的であり、VS エディターのツールチップにより、型の出所に関する詳細がすぐにわかります。

また、COM 相互運用層の RCW に名前空間タグを使用して、コード内でこれらの変数を明示的に呼び出す傾向があります (ライフサイクルとコレクションに関して特別な注意が必要な場合があります)。

using _Interop = Some.Interop.Namespace;

パフォーマンスに関しては、良い点も悪い点もありません。すべてはコンパイル時に解決され、完全修飾名を使用するかどうかに関係なく、生成される MSIL は同一になります。

.NET の世界でその使用が普及している理由は、デザイナー マークアップなどの自動生成コードのためです。その場合、コード内にある他のクラスと競合する可能性があるため、クラス名のような完全修飾名を使用することをお勧めします。

ReSharper のようなツールをお持ちの場合、実際に、どの完全修飾参照が不必要かを教えてくれます (例:グレー表示にすることで)削除できるようになります。さまざまなコード ベース間でコードを頻繁にカット アンド ペーストする場合は、それらを完全に修飾することが必須になります。(繰り返しますが、なぜ常にカットアンドペーストをしたいのでしょうか。それは悪い形式のコード再利用です!)

実際にマイナス面があるとは思えませんが、読みやすさと実際に費やされるコーディング時間の違いだけです。一般に、あいまいなオブジェクトを含む名前空間がない場合、それは実際には必要ないと思います。もう 1 つ考慮すべき点は、使用レベルです。リフレクションを使用するメソッドが 1 つあり、System.Reflection を 10 回入力しても問題ない場合は、大した問題ではありませんが、名前空間を頻繁に使用する予定がある場合は、インクルードをお勧めします。

状況に応じて、余分な修飾子によって警告が生成されます (これが冗長という意味の場合)。警告をエラーとして扱うと、それはかなり重大な欠点となります。

たとえば、GCC でこれに遭遇しました。

struct A {
    int A::b; // warning!
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top