web-dev-qa-db-ja.com

C#で未使用のusingディレクティブを削除する理由

開発者がVisual Studio 2008で「未使用のUsingsを削除」機能を使用する理由(ソースコードの整理以外に)があるのではないかと思っています。

113
bounav

それらを持ち出したい理由はいくつかあります。

  • 無意味です。付加価値はありません。
  • ややこしい。その名前空間から何が使用されていますか?
  • そうしないと、コードが時間とともに変化するにつれて、無意味なusingステートメントが徐々に蓄積されます。
  • 静的解析は遅くなります。
  • コードのコンパイルが遅くなります。

一方、それらを残す理由はあまりありません。削除する手間を省くと思います。しかし、あなたがその怠け者なら、あなたはより大きな問題を抱えています!

181
John Feminella

私はまったく反対だと思います-不要で不要なusingステートメントを削除することは非常に役立ちます。

3、6、9か月でコードに戻らなければならないことを想像してください。さもないと誰かがコードを引き継いで保守する必要があります。

本当に必要ではないusingステートメントの膨大な長いリストがある場合、コードを見るとかなり混乱する可能性があります。その名前空間から何も使用されていない場合、なぜそこで使用されていますか?

プロフェッショナルな環境での長期的な保守性の観点からは、コードをできる限りクリーンに保つことを強くお勧めします-それには、不要なものをダンプすることも含まれます。混乱が少ないことは、混乱が少ないことと保守性が高いことを意味します。

マーク

24
marc_s

これは私にとって非常に賢明な質問であるように思われ、それは反応する人々によって非常に軽flip的な方法で扱われています。

ソースコードの変更は正当化する必要があると思います。これらの変更には、隠れたコストがかかる可能性があり、質問を投げかけた人はこれを認識したかったのです。彼らは、「怠inな」と呼ばれることを求めませんでした。

Resharperを使い始めたばかりで、担当するプロジェクトについて警告とスタイルのヒントを出し始めています。その中には、冗長なusingディレクティブの削除だけでなく、冗長な修飾子、大文字の使用なども含まれます。私の本能は、コードを整理し、すべてのヒントを解決することですが、私のビジネスヘッドは、不当な変更に対して警告します。

自動ビルドプロセスを使用しているため、SVNリポジトリへの変更はプロジェクト/バグ/問題にリンクできない変更を生成し、以前のバージョンに機能的な変更を提供しない自動ビルドとリリースをトリガーします。

冗長な修飾子の削除を見ると、ドメイン層とデータ層が修飾子によってのみ区別されるため、開発者に混乱を引き起こす可能性があります。

旧暦の大文字の適切な使用(つまり、ABCD-> Abcd)を見る場合、Resharperは、その参照クラス名を使用するXmlファイルをリファクタリングしないことを考慮する必要があります。

したがって、これらのヒントに従うことは、見かけほど簡単ではなく、敬意を持って扱われるべきです。

14
Chris K

Intellisenseポップアップのオプションが少ない(特に名前空間に多くの拡張メソッドが含まれる場合)。

理論的には、Intellisenseも高速になるはずです。

13
cbp

既に説明した理由に加えて、不必要な名前の競合を防ぎます。このファイルを検討してください:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

名前空間System.IOとSystem.Windows.Shapesの両方にそれぞれPathというクラスが含まれているため、このコードはコンパイルされません。完全なクラスパスを使用して修正できますが、

        private static string temporaryPath = System.IO.Path.GetTempFileName();

または、単にusing System.Windows.Shapes;行を削除することもできます。

12
hypehuman

それらを削除します。見るコードが減り、時間と混乱を省くことができます。もっと多くの人が物事をシンプルに保ちたいと願っていますNEAT and TIDY。部屋に汚れたシャツとズボンを持っているようなものです。それはいので、なぜそこにあるのか疑問に思う必要があります。

5
Tim Duncan

また、未使用の使用を削除した後、プロジェクトからdll /プロジェクト参照を削除できると仮定すると、誤った循環依存関係を防ぐのにも役立ちます。

4
Jeremy C.

コードのコンパイルが速くなります。

3
Dead account

最近、未使用のインポートを削除することが非常に役立ち、重要である別の理由を得ました。

2つのアセンブリがあり、一方が他方を参照しているとします(ここでは、最初のアセンブリをAと参照されるBと呼びます)。これで、Bに依存するコードがAにある場合、すべて問題ありません。ただし、開発プロセスのある段階で、実際にはそのコードはもう必要ないことに気づきますが、usingステートメントはそのままにしておきます。これで、意味のないusing- directiveだけでなく、Assembly-reference to Bになります。これは、廃止されたディレクティブ以外では使用されません。これにより、最初にAもロードする必要があるため、Bのコンパイルに必要な時間が増加します。

そのため、これはコードが簡潔で読みやすいという問題だけでなく、参照されているアセンブリのすべてが存在しないであるプロダクションコードでアセンブリ参照を維持することに関する問題でもあります。

最後に、例ではBとAを一緒に出荷する必要がありましたが、BはAのどこでも使用されませんが、usingセクションで使用されます。これは、アセンブリをloadingするときにAruntime-performanceに大きな影響を与えます。

2
HimBromBeere

少なくとも理論的には、C#.csファイル(または単一のプログラムソースコードファイル)が与えられた場合、コードを見て、必要なものすべてをシミュレートする環境を作成できるはずです。いくつかのコンパイル/解析手法を使用すると、それを自動的に実行するツールを作成することもできます。少なくとも念頭においてこれが行われた場合、コードファイルの内容をすべて理解できるようになります。

1000個のusingディレクティブを含む.csファイルが与えられた場合、実際には10個だけが使用されたと考えてください。外部の世界を参照するコードに新しく導入されたシンボルを見るときはいつでも、それが何であるかを理解するためにそれらの1000行を調べなければなりません。これは明らかに上記の手順を遅くします。したがって、それらを10に減らすことができれば、助けになります!

私の意見では、C#usingディレクティブは非常に弱いです。汎用性を失うことなく単一の汎用シンボルを指定できず、拡張メソッドを使用するためにusingエイリアスディレクティブを使用できないためです。これは、Java、Python、Haskellなど)のような他の言語では当てはまりません。これらの言語では、(ほとんど)あなたが外の世界から望むものを正確に指定できます。可能な限りusingエイリアスを使用することをお勧めします。

2
Earth Engine