2012-11-14 21 views
10

私は最近、C#の構造体にメソッドがあることを発見しました。static structメソッドとstatic classメソッドの違いは何ですか?

間違いなく、静的なクラスの静的メソッドではなく、空の構造体の静的メソッドを使用していることがわかりました。

public struct Foo 
{ 
    public static void Bar(Param param) 
    { 
     ... 
    } 
} 

この時点では、実際に構造体として使用されているわけではありません。プロパティーはまったくありません。

これは、クラスの静的メソッド(staticまたはstatic)とはまったく異なりますか?どちらか一方を優先する理由はありますか? (私の腸は、静的構造体のメソッドを使用すると、最低でも、あまり直感的であることを私に伝えます)

答えて

16

いいえ、静的メンバーはタイプにはないタイプのインスタンスに属しています。静的クラスメンバ宣言と静的なstructメンバ宣言との間には、(パフォーマンスやセマンティクスに関して)違いはありません。

タイプの唯一の関数が静的メンバーを含むことになっている場合は、代わりに静的クラスを使用する必要があります。構造体には、暗黙的で変更不可能なpublic、引数のないコンストラクタがあります。型にインスタンスメソッドがない場合は、インスタンスを作成する機能を削除する必要があります。クラスstaticを宣言することは、それをabstract sealedと宣言するのと同じです。そのため、開発者は意図せずにインスタンスを誤って作成することはできません。

+3

クラス 'static'を宣言すると、コンパイラが変数宣言または型変換の型の任意の用途にエラーとしてフラグを付けることができるという利点が追加されました。 –

+0

@mikezまた、インスタンスメンバーの宣言にエラーとしてフラグを立てるだけでなく、 – cdhowie

+3

@mikezもっと重要な違いは、「抽象密封クラス」は単純に無効なC#だということです。 – svick

3

動作は変わりません。構造体とクラスのフィーチャの交差を大幅に増やすことで、C#は構造体を弱体化させました。個人的には、私はもっと正しいと思われるので、クラスを使用します(ほとんどの言語での規則に沿っています)。

+0

既にC++で構造体のメソッドとコンストラクタを定義できるため、C#で初めて導入された新機能ではありません。 – Jagger

+0

'[StructLayout(LayoutKind.Explicit)]'が設定されている構造体はどうですか?それをクラスで置き換えることはできませんでした。 –

関連する問題