3

私はこれを理解することができません。以下のようにVS2010で小さな例をやってみました。

「したがって、静的クラスを作成することは、静的メンバーとプライベート コンストラクターのみを含むクラスを作成することとほとんど同じです」

このステートメントは、プライベート コンストラクターを持つクラスと、以下のような 1 つ以上の静的メソッドが静的クラスであることを意味しますか? クラスで static キーワードが言及されている場合にのみ、クラスを static と呼ぶことはわかっています。

また、以下のクラスを継承することも、このクラスをインスタンス化することもできませんよね?

public class Base
{
    private Base() { Console.WriteLine(" I am from normal Base constructor"); }
    static void NewMethod() { Console.WriteLine("Hey I am from Static Base"); }
    public void New() { } 
}
4

7 に答える 7

13

したがって、静的クラスを作成することは、静的メンバーとプライベート コンストラクターのみを含むクラスを作成することとほぼ同じです。

このステートメントは正しい考えを伝えようとしていますが、そうしていません。静的クラスは、静的メンバーとプライベート コンストラクターのみを持つクラスとは異なります静的メンバーとプライベート コンストラクターを持つクラスを次に示します。

class X
{
    private X() {}
    public static X Y() { return new X(); }
}

しかし、それは静的クラスのようなものではありません! そのステートメントの作成者は、プライベート コンストラクターを使用するとインスタンスを作成できないと考えているようですが、もちろんそうではありません。

より正確なステートメントは次のようになります。

静的クラスを作成することは、抽象的で封印されたクラスを作成することによく似ており、インスタンス メンバーを含みません。

実際、C# コンパイラが静的クラスのコードを生成するとき、まさにそれが行われます。つまり、クラスを抽象 (直接インスタンス化できないようにするため) とシール (拡張できないようにするため) の両方としてマークします。

クラスをabstractとsealedの両方で宣言することは合法ではないことに注意してください。C# でこれを行う唯一の方法は、静的クラスを作成することです。

誤解を招く文を MSDN ドキュメント マネージャーに知らせます。ご指摘ありがとうございます。

于 2013-02-13T15:42:55.930 に答える
12

それが意味することは次のとおりです。

public static class Foo
{
    public static void Bar() { }
}

本質的に同じです

public class Foo
{
    private Foo() { }
    public static void Bar() { }
}

クラスにプライベート コンストラクターしかない場合は、クラスの外部でインスタンス化できないためです。

于 2013-02-13T13:39:25.513 に答える
4

「このステートメントは、プライベート コンストラクターと、以下のような 1 つ以上の静的メソッドを持つクラスが静的クラスであることを意味しますか?」

答えはいいえです。1 つの違いは、MSDNから引用した次の文で正確に説明されています。

静的クラスを使用する利点は、インスタンス メンバーが誤って追加されていないことをコンパイラが確認できることです。


Class2これは、以下に示すコンパイラ エラーが発生することを意味します。

public class Class1
{
    private Class1() { }
    public static void Method() { }
    private string member; // valid, but pointless
}

public static class Class2
{
    public static void Method() { }
    private string member; // error CS0708
}

さらに重要なClass1ことは、プライベート コンストラクターがありますが、インスタンス化される可能性があることです。

public class Class1
{
    private Class1() { }

    private static Class1 instance = new Class1();

    public static Class1 Instance
    {
        get { return instance; }
    }
}

一方、静的クラスはインスタンス化されない場合があります。

于 2013-02-13T13:43:31.667 に答える
1

public コンストラクターがなく、private コンストラクターのみが存在するため、継承できません。同じ理由で、インスタンスを作成できません。

この質問の範囲内では、それらは同じと見なすことができます。それを静的クラスと呼ぶことができますか。staticクラス定義のようにマークされていないため、公式にはそうではないと思います。しかし、機能の観点では、それを と呼ぶことができますstatic

于 2013-02-13T13:44:39.293 に答える
0

あなたの例では、New()メソッドを呼び出すことができる唯一の方法は、別のクラスでインスタンス化できないBaseため、インスタンスを返す別のメソッドを追加する場合です。Baseその余分なメソッドがないと、機能的に静的クラスと同じになります。

于 2013-02-13T13:41:08.663 に答える
0

声明をどこで入手しましたか:

したがって、静的クラスを作成することは、静的メンバーとプライベート コンストラクターのみを含むクラスを作成することとほぼ同じです。

言おうとしているのは、静的クラスのインスタンスを作成できないということです。

静的クラスを作成する方法は、staticキーワードを使用することです。クラス内のすべてのメンバーも静的である必要があります。

public static class MyStaticClass
{
      static MyStaticClass() { /* Constructor.  Optional. */ }
      public static void MyMethod() { ... }
      public static int MyProperty{ get; set; }
}

このクラスのインスタンスを作成することはできません。次の呼び出しはコンパイルされません。

new MyStaticClass();
于 2013-02-13T13:45:43.013 に答える