web-dev-qa-db-ja.com

静的クラスの静的メソッドと非静的クラスの静的メソッド(C#)

私はインタビューで上記の質問をされました。違いを説明していただけますか? (パフォーマンス-メモリ使用-いつ使用するか?)

ありがとうございました、

エルカン

49
Erkan Y.

静的クラスを宣言すると、そのクラスの意図が静的機能のコレクションになることが文書化され、インスタンスメンバーを追加するとコンパイルエラーが発生します。

静的メンバーを持つ非静的クラスは、通常、クラスがある時点でインスタンス化されるように設計されていることを示します。これらのクラスの静的メソッドは通常、次の2つのことのいずれかを行います。

  1. そのタイプのインスタンスを作成するためのファクトリメソッドを提供します。
  2. タイプのインスタンスを必要としないヘルパー機能を提供します。

また、すでに述べたように、拡張メソッドは静的クラスでのみ宣言できます。

52

あなたは違いを尋ねられたと思いますか?

静的クラスの静的メソッドを使用して、拡張メソッドを定義できます。非静的クラスの静的メソッドはできません。

19
JaredPar

パフォーマンスとメモリ使用量の観点から。正確には何も。静的クラスがあるということは、あなたがknowインスタンスがないことを意味しますが、1.1ではプライベートコンストラクターで十分です。インスタンスを持つだけでは意味がない場合は、静的クラスを使用してください。 (ユーティリティクラスなど)

16
Marc Gravell

ユーティリティ関数を提供していて、すべてのメソッドが静的である場合は、静的クラスで静的メソッドを使用することをお勧めします。

インスタンスを処理するだけのユーティリティメソッドを提供する場合は、非静的クラスで静的メソッドを使用することをお勧めします。例えば:

var myClass = MyClass.Create();
var myClass = MyClass.Parse("serialized.MyClass");
6
mythz

メモリに関しては、わずかな違いがあります。非静的クラスの静的メソッドは、その型の最初のインスタンスが作成されたときにのみ割り当てられ、その型の最後のインスタンスが割り当て解除されたときに割り当て解除されます。インスタンスオブジェクトの静的メソッドは、使用するメモリの量を減らすために同じタイプのオブジェクトのコレクションがある場合に非常に役立ちます。静的メソッドを使用することの欠点は、それらが単体テストできないことです。そのため、静的メソッドを作成する前に、コードカバレッジにどのように影響するかに注意する必要があります。

0
Cristina Alboni

すべての静的メソッドを持つ通常のクラスを使用するか、静的クラスを使用するかを決定する際に直面した大きな違いの1つは、通常のクラスがインターフェースの実装をサポートしているのに対し、静的クラスはサポートしていないことです。静的クラスは、静的関数(通常はヘルパー関数)のコレクションであり、プログラムのメインストリームに含まれないことが確実な場合にのみ使用します。依存関係の注入、ユニットテストなどのために、インターフェイスプログラミングを推進しています。したがって、プログラムのメインフローでは、静的メソッドを持つ通常のクラスを使用しています。

0
Prem