0

MSDNFAQその他の 基本 ガイドが無視しているように見える静的変数に関する4つの簡単な質問。

  1. public staticと同じですかstatic public


    public static class Globals {...}



    static public class Globals {...}

    同じ?違う?

  2. 関数のように、public static classinの変数は、クラスの名前付きグローバルインスタンスを介して他のクラス内に表示されるC#必要があるようです。どうしてこれなの?これは、素朴な観点からは直感的ではないように思われます(利用可能な範囲内のパブリック変数を使用して、の単一のインスタンスを提供するように思われます)。明らかにそうではないので、アクセスを提供するためにオブジェクトにメンバー変数を作成する必要がある理由について、専門家からの視点が必要でした。(注:MSDN Faqには、メンバーを持たない変数の例が含まれていますが、違いがある場合はどうなるかについての議論はありません。public staticstaticpublic static classpublicclassC#static classstatic

    static classstaticstatic持っているメンバーpublic static class。)(つまり、二重のstaticステータスの結果があった場合はどうなりますか?)

    例:
    public static class Globals { public static Camera camera1; }//doubly static

  3. public a内の非static機能public static classが適切な場合はありますか?公開したくないものもあると思いますが、そのような場合は公開したいだけではありませんprivate。(例が単純であればあるほど、独学で学び、リフレクションC#などのより複雑なトピックを理解しようとしています)

  4. 不思議なことpublic enumに、aの内部は、名前付きグローバルインスタンスを介してキーワードpublic static classなしで表示されます。ここで一般的な要件が適用されないstaticのはなぜですか??ではなくstatic可視を使用する場合に心配すべきことはありますか?public enumpublic static enum

    public static class Globals { public enum Dummy { Everything=42}; }
    //Enum is visible w/out static!

前もって感謝します。また、複数の質問をお詫びします。これを複数の投稿に分割するかどうかについては不安でしたが、すべてC# static使用に関連しているため、1つの投稿が最も適切であると考えました。

4

3 に答える 3

2

1:順序は関係ありません。読みやすくするために、物を注文する方法の標準がありますが、コンパイラがすべてを読み取るので、それはまったく問題ではありません。

個人的には、「static public」ではなく、「publicstatic」と書くのがベストだと思います。

ReSharperをVisualStudioにダウンロードすると、「静的」、「公開」、「読み取り専用」などの修飾子に優先順位が事前定義されています。これらの標準に準拠していない場合は、順序を修正するように提案されます。修飾子の。修飾子の異なる優先順位を使用することを選択した場合は、希望する順序に合わせてReSharperの設定を変更できます。

それ以外に-ReSharperは他の多くの驚異を実行し、強くお勧めします。


2:静的クラスには静的メンバーのみを含めることができます。クラスの「静的」とは、クラスがインスタンスを持つことができないことを意味し、あなたが言ったように、ある種の存在として宣言されます。メンバーの「静的」とは、別の意味です。通常、メンバーはインスタンスによって所有されます。ただし、静的メンバーはクラスによって所有されます。つまり、クラスのすべてのインスタンス間で共有され、クラスの実際のインスタンスなしで使用されます。

public static class Math
{
    public static readonly int ZERO = 0;
}

ここで、ZEROが静的であることがわかります。これは、クラスMathに属していることを意味します。だからあなたはすることができます:

Math.ZERO

Mathクラスが静的でなかったとしても、クラス自体を介してZEROメンバーにアクセスします。ZEROは、インスタンスではなくクラスに属しているため、Mathインスタンスのメンバーにはなりません。つまり、「静的メンバー」になります。


3:これも2番目の答えです。非静的クラスは、そのインスタンスとそのインスタンスに属するメンバーを持つことができることを意味しますが、クラス自体に属するクラスメンバー(静的)を持つこともできます。

例:

public class Quiz
{
    public static readonly int FAIL_GRADE = 45;

    public int Grade;
    public string StudentName;
}

したがって、すべてのクイズには成績とそれに関連付けられた生徒がいますが、クラス「クイズ」全体に属する定数もあり、どの成績が不合格と見なされるかを示します。

上記の場合、次のようにすることもできます。

public const int FAIL_GRADE = 45;

したがって、論理的に言えば、「const」は「静的読み取り専用」を意味することがわかります。ただし、「const」を使用できない場合は、「staticreadonly」を使用する必要があります。「const」は、「int」、「float」、「bool」などの基本型の前にのみ付けることができます。

「静的」メンバーが読み取り専用ではない例を次に示します。

public static class Student
{
    public static int TestsTaken = 0;

    public string Name;

    public int DoQuiz(Quiz quiz, Answers answers)
    {
        TestsTaken++;

        // Some answers checking logic and grade returning
    }
}

上記の例では、Studentクラスの静的メンバーが、Studentのインスタンスが特定のアクション(DoQuiz)を実行した回数のカウンターとして使用されていることがわかります。TestsTakenは実際にはクイズや学校のクラスにあるべきものであるため、ここでの使用は実際にはあまり良いプログラミングではありません。しかし、「静的」な使用法の例は有効です。


4:静的クラスの列挙型は「static」キーワードを必要とせず、実際、静的列挙型をどこでも宣言することはできません。列挙型はクラスのメンバーとは見なされませんが、そのサブタイプ(サブクラス、インターフェイス、列挙型など)と見なされます。

列挙型がクラス内で宣言されているという事実は、単に列挙型を使用したい場合は、クラスも参照する必要があることを意味します。これは通常、論理的な目的、抽象化、またはカプセル化のためにクラス内に配置されます(この場合は「プライベート」と宣言されるため、クラス内では使用できますが、クラス外では使用できません)。

例:

public static class Math
{
    private enum SpecialSigns
    {
        Sigma,
        Alpha,
        Pi,
        etc
    }
}

上記の例では、SpecialSigns列挙型はMathクラス内から使用できますが、外部には表示されません。

パブリックとして宣言することもできるので、Mathクラスを使用する場合は、SpecialSigns列挙型も使用できます。その場合、メソッドの戻りタイプまたはパブリックメンバーのタイプとしてSpecialSigns値を使用することもできます。SpecialSignsがプライベートの場合、外部コードがアクセスできないため(存在を認識していないため)、戻り値やメンバータイプなどとして理解できないため、これを行うことはできません。

それでも、SpecialSigns列挙型はクラスのメンバーではなく、認識の範囲内でのみ定義されます。

于 2012-04-30T01:09:34.873 に答える
2
  1. メソッド仕様によると:

メソッド宣言には、一連の属性(セクション17)と、4つのアクセス修飾子(セクション10.2.3)、新しい(セクション10.2.2)、静的(セクション10.5.2)、仮想(セクション10.2.3)の有効な組み合わせを含めることができます。 10.5.3)、オーバーライド(セクション10.5.4)、封印(セクション10.5.5)、抽象(セクション10.5.6)、および外部(セクション10.5.7)修飾子。

順序は関係ありません

于 2012-04-30T00:37:32.777 に答える
2
  1. はい、順序は重要ではありません。
  2. はい、静的クラスには静的メンバーのみを含めることができます(#4を除く)が、パブリックである必要はありません。
  3. はい、パブリック静的メソッドを持つことができますが、パブリック静的メソッドが使用するプライベート静的メソッド
  4. ネストされた型宣言は静的である必要はありません。

覚えておくべきもう1つのことは、C#の「内部」可視性です。私のコードベースでは、内部静的クラスの多くの用途が見つかりました(ほとんどの場合、拡張メソッドの用途です)。

于 2012-04-30T00:37:42.637 に答える