-2

静的クラスと静的メソッドのみを持つクラス(およびたとえばプライベートコンストラクター)の違いは何ですか?

たちが持っているとしましょう

using System;

public class Test
{
        public static void Main()
        {
                Info.SetName("nnn");
        Console.WriteLine(Info.Name);
        Info.SetName("nn2");
        Console.WriteLine(Info.Name);

        Info2.SetName("nnn");
        Console.WriteLine(Info2.Name);
        Info2.SetName("nn2");
        Console.WriteLine(Info2.Name);
        }
}

public class Info
{
    public static string Name;
    public static void SetName(string name){
        Name = name;
    }
}

public static class Info2
{
    public static string Name;
    public static void SetName(string name){
        Name = name;
    }
}

メソッド/プロパティのアクセス パフォーマンス、コードの可読性、コードの拡張性の観点から?

4

11 に答える 11

1

静的クラスでは、そのクラス内のすべてのメソッドが静的である必要がありますが、静的メソッドを持つ通常のクラスはインスタンス メソッドを持つこともできます。

パフォーマンスの観点からは、オブジェクトの実際のインスタンスをチェックするオーバーヘッドが発生しないため、静的メソッドの方がわずかに高速です。

読みやすさの観点から、静的メソッドは一般的に読みやすいですが、適切ではない場合もあります。たとえば、次のようになります。

DAL.SavePerson();

vs.

var myRepository = new SqlRepository();
myRepository.SavePerson();
于 2013-07-26T14:06:24.683 に答える
0

技術的には、静的メソッドのみで非スタークラスのインスタンスを作成できます。コンストラクターがプライベートであっても、リフレクションを使用して (またはクラスの静的メソッド内で) 作成できます。sealとして宣言されていない限り、その種類のクラスから派生クラスを作成することもできます。

静的クラスは常に抽象的(したがって、そのインスタンスを作成することはできません) であり、封印されています (派生クラスも作成できません)。したがって、静的クラスは抽象シールクラスのショートカットです。

  Type tp = typeof(Info2); // <- Info2 is static class

  if (tp.IsAbstract && tp.IsSealed) { // <- And it is...
    ... 
于 2013-07-26T14:09:54.757 に答える
0

静的クラス インスタンスを作成することはできません。

于 2013-07-26T14:06:39.663 に答える
0

コンストラクターを非表示にしない限り、静的メソッドのみを持つクラスのインスタンスを作成することは可能です。

静的クラスのインスタンスを作成することはできず、コンパイラはこれを強制します。

于 2013-07-26T14:06:44.113 に答える
0

簡単に言えば、静的クラスには静的メソッドのみを含めることができます。非静的クラスには明示的な制限がなく、静的メソッドと非静的メソッドの両方を含めることができます。

長い答え: http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

于 2013-07-26T14:07:16.213 に答える
0

static classクラスのインスタンスを作成しても意味がない場合に使用されます。たとえば、static class HelperMethodsclass HelperMethods

HelperMethods.DoSomething(); // makes sense

new HelperMethods(); // absolutely no use if only contains static methods
于 2013-07-26T14:05:27.560 に答える
0

クラスを として宣言するとstatic、コンパイラは、インスタンス メンバーを追加しなかったことを強制し、インスタンスが作成されないようにすることもできます(メンバーのみを持つ非クラスであり、コンストラクターは引き続きインスタンスを作成できます)。メソッドの 1 つの中に!)staticstaticprivatestatic

したがって、これは非クラスに対して有効です。static

class Foo {
    private Foo() { }
    public static Foo Create() { return new Foo(); }
}

しかし、クラスにとっては合法ではありません。static

于 2013-07-26T14:05:42.747 に答える
0

静的クラスの場合、インスタンスを作成できません。それ以外の場合は、すべてのメンバーとフィールドが静的であっても、いつでも作成できます。

于 2013-07-26T14:05:43.350 に答える
0

アクセス性能:ほとんど変わりません。

コードの読みやすさ: クラスをインスタンス化してはならない場合は、 static 修飾子を使用すると読みやすくなります。また、コンパイル時のチェックを追加して、誤って間違った方法で使用するのを防ぎます。

コードの拡張性: 違いはありません (少なくとも静的メンバーに関しては - もちろん、 static 修飾子を使用しない場合は非静的メンバーでクラスを拡張できますが、 static 修飾子を使用すると、クラスは暗黙的にシールされます)

追記: 拡張メソッドは、静的クラスでのみ宣言できます。

于 2013-07-26T14:12:49.423 に答える