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


120

開発者UsingsがVisual Studio 2008で「未使用の削除」機能を使用する理由(ソースコードの片付け以外)があるかどうか疑問に思っています。


これはVisual Studio自体の機能ではなく、PowerCommands for Visual Studioの機能だと思います。
Hosam Aly

3
VS2008では、これはVS自体の機能(usingステートメントを並べ替える機能と共に)です。
Richard

1
@Hosam:PowerCommandsを使用すると、プロジェクト/ソリューション全体に対してそれを行うことができます。これをファイルごとに行うことは、VS自体の機能です。
コンフィギュレー

3
ところで、この種のクリーンアップをより正確に制御したい場合は、Resharperをチェックしてください。
John Feminella、2009年

2
私は実際にこの機能が本当に嫌いです-誰かがそれらをクリーンアップした後、私は常に自分でファイルを編集してすべてのシステム名前空間(通常はSystem、System.Collections.Generic、およびSystem.Linq)を再度追加する必要があることに気付きます。節約する以上の摩擦。これで、フレームワークの名前空間ではなく、独自のプロジェクトの名前空間です。これらは、プログラムの関連付けを明確にするためにクリーンアップする方が理にかなっています。特定の名前空間からのインポートのみをVSでクリーンアップし、より頻繁に必要なシステムのものを残す方法があったらいいのにと思います。
user1454265 2015

回答:


186

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

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

一方、それらを残す理由はそれほど多くありません。それらを削除する手間を省くことができると思います。しかし、あなたがその怠惰な人なら、もっと大きな問題を抱えています!


59
優れたプログラマーは怠惰で、やらないことを最大化します。:D
Nicolas Dorier 2009

34
優れたプログラマーが怠惰であることに同意しませんが、あなたの発言の感情には同意します。優れたプログラマーは、コードをクリーンに保つためにそれらを削除し、それにより、自分や他の人の将来の作業/問題/問題を回避します。
アラン

2
そう、それは素晴らしいリンクです。私の要点は、「悪い怠惰」ではなく「良い怠惰」が欲しいということだけだったと思います。後者は、プログラマーが良いコードを書くことに煩わされることができなかった場所です。
アラン

5
標準の名前空間を残しておくことにもメリットがあります。大規模なプロジェクトやチームでは、それらをそのままにしておくと、潜在的なマージの競合が少なくなり、コードレビュー用のファイルが少なくなります。さらに、開発者の多くは混乱を招き、拡張メソッドを見つけるのが難しいため、これらの拡張メソッドに必要な名前空間を見つけるのが面倒です。新しい開発者はSystem.Linqをコードファイルに含めることに慣れていて、助けを求める前に特定のメソッドが利用できない理由を理解しようとする多くの時間を浪費する可能性があります。
Mark At Ramp51 14

5
将来のコーディングでインテリセンスが地獄のように馬鹿になるのを防ぐために、それらのいくつかを保持したい場合があります。
yazanpro 2014年

24

私は全く逆だと思います-不要な、不必要なusingステートメントを削除することは非常に役に立ちます。

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

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

私は、プロの環境での長期的な保守性の観点から、コードをできるだけクリーンに保つことを強くお勧めします。これには、コードから不要なものをダンプすることも含まれます。乱雑さが減れば、混乱が減り、保守性が向上します。

マーク


14

これは非常に賢明な質問であるように私には思われます、それは人々が応答することによって非常にばかげた方法で扱われています。

ソースコードの変更は正当化する必要があると思います。これらの変更は隠れたコストを伴う可能性があり、質問をする人はこれを認識させたいと考えました。一人の人が軽蔑したように、彼らは「怠惰」と呼ばれることを求めませんでした。

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

私たちは自動ビルドプロセスを使用しているため、SVNリポジトリに変更を加えると、プロジェクト/バグ/問題にリンクできない変更が生成され、自動ビルドとリリースがトリガーされ、以前のバージョンに機能上の変更はありませんでした。

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

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

したがって、これらのヒントに従うことは、見かけほど簡単ではなく、敬意を持って扱う必要があります。


6
良い点ですが、クリーンで複雑ではないコードを保持することで、ビジネス上の目的でもある保守性が向上することを忘れないでください。両方に重みを付ける必要があります。理想的には、リリース直後にこの種のリファクタリングを実行して、可能な限りクリーンなスレートで新しいものを開始し、最終的なリグレッションをキャッチするための十分な時間を確保できるようにします。
David Reis

14

すでに与えられた理由に加えて、それは不必要な名前の衝突を防ぎます。このファイルを考えてみましょう:

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;ます。


13

Intellisenseポップアップのオプションが少なくなりました(特に、名前空間に多数のExtensionメソッドが含まれている場合)。

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


1
インテリセンスの場合は+1。起動時は実際に遅いので(「キャッシュの作成中、後で再試行します」と定期的に表示されます)、これは実際に重要な場合があります。誰もが話している時間をコンパイルします...私はまだ数字を見ていません。
Luc

5

それらを削除します。確認するコードが少ないので、時間と混乱を節約できます。もっと多くの人に、シンプルできちんとした、きちんとしたものを維持してほしいと思います。それはあなたの部屋に汚れたシャツとズボンを持っているようなものです。それは醜く、なぜそこにあるのか不思議に思う必要があります。


4

また、未使用の使用法を削除した後、プロジェクトから一部のdll /プロジェクト参照を削除できると想定して、誤った循環依存関係を防止することもできます。


3

コードはより速くコンパイルされます。


5
それを裏付ける証拠はありますか?
cjk 2009年

14
あらCK-あなたは再び私を捕まえた。私は嘘をついた。不要なテキストを削除すると、実際にはコードのコンパイルが遅くなります。考えてみてください:)
デッドアカウント

@ck:未使用のusingステートメントを作業中のプロジェクトから削除すると、コンパイル時間が大幅に改善されることを確認しました。もちろん、ハードドライブから読み取るバイト数は少なくなります。
コンフィギュレー

19
いくつかの実際の統計を見るとよいでしょう。コンパイル中に数ミリ秒しか節約しない場合、速度は説得力のある議論ではありません。ただし、不要なusingステートメントを削除する理由は他にもあります。
グレッグ

3
それはうそをつくかどうかではありません。賢明な人なら、乱雑さが減れば効率が上がると思います。それをバックアップするための「証拠」は、応答に価値を提供し、「高速」は数ミリ秒を意味するだけでなく、実際にはプロジェクトを高速にコンパイルするためのエクスペリエンスの向上という議論をサポートすることです。
Matheus Felipe

3

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

2つのアセンブリがあり、一方が他方を参照しているとしましょう(今のところ、最初のアセンブリと参照先を呼び出しAますB)。これで、Bに依存するコードがAにある場合、すべてが問題ありません。ただし、開発プロセスのある段階で、実際にはそのコードは不要であることに気付きますが、usingステートメントは元の場所に残します。今、あなたは無意味持っているだけでなく、using-directiveなく、アセンブリ参照Bどこにもなく、時代遅れのディレクティブで使用されていないが。これも最初にA、をBロードする必要があるため、コンパイルに必要な時間を増やします。

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

最後に、例ではBとAを一緒に出荷する必要がありましたが、BはAのどこでも使用されておらず、using-section で使用されています。これは、大規模な影響を与えますランタイムの-公演A時にロードするアセンブリを。


2

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.