1

VisualStudioでResharperツールを使用しています

以下に書かれた非常に単純なクラスを考えてみましょう。

class Test()
{

   //constructors do not have any return type.   
   Test()
   {
      System.Console.WriteLine("Hello World!");
   } 

   static Test()
   {
        System.Console.WriteLine("Hello World in Static constructors");
   }

   public void A()
   {
      System.Console.WriteLine("A simple function in a class");
   }

}


class Program
  {
    static void Main(string[] args)
    {
        var asa = new Test(); //Implicitly Typed local variables.
        asa.A();

    }
}

varを使用します(コンパイラーは、初期化ステートメントの右側の式から変数の型を推測する必要があります)。

いくつかの説明の質問がありますが、それらは以下のとおりです。

  1. コンパイラに余分な負担がかかりますか?
  2. クラスはいくつのコンストラクターを持つことができますか?
  3. 静的コンストラクターが最初に呼び出されるのはなぜですか?(ブレークポイントを設定してチェックアウトしましたか?)
  4. asa = new Test();をテストしてみませんか。Resharperには好まれませんか?
  5. 初心者として最初にResharperを使用するのは本当に良い考えですか?(私自身はCおよび.netプログラミングの初心者です!)

前もって感謝します。

4

4 に答える 4

7
  1. コンパイラへの余分な負担は基本的に関係ありません-を使用するかどうかについての決定の一部であってはなりませんvar。コメントに記載されているように、明示的に宣言された変数を使用する場合は、コンパイラーに少し多くの作業が必要になる可能性があります...しかし、繰り返しになりますが、それは重要ではありません。

  2. クラスには任意の数のコンストラクターを含めることができます...ただし、すぐに扱いにくくなります。

  3. 静的コンストラクターは、クラスを最初に使用する前に1呼び出されます(静的メソッドまたはコンストラクター呼び出しのどちらを使用する場合でも)。詳細については、C#仕様をお読みください-C#5仕様のセクション10.12には次のものが含まれています。

    閉じたクラス型の静的コンストラクターは、特定のアプリケーションドメインで最大1回実行されます。静的コンストラクターの実行は、アプリケーションドメイン内で発生する次のイベントの最初のものによってトリガーされます。

    • クラスタイプのインスタンスが作成されます。
    • クラスタイプの静的メンバーのいずれかが参照されます。
  4. 代替案を提案したり、警告として扱ったりするようにReSharperを構成できます。この面で、思いどおりに機能するようにします。

于 2012-09-17T06:06:45.653 に答える
2
  1. はい、追加の作業が必要ですがvar、コンパイラが型を推測するのが非常に簡単な状況でのみキーワードを使用できます。

  2. コンストラクターの数に制約はありませんが、コンストラクターが従わなければならないいくつかのルールがあります(つまり、コンパイラーがどのコンストラクターを呼び出すかを明確にする必要があります)

  3. 理由はわかりませんが、これはルールの1つにすぎないとしましょう。興味深いのは、beforefieldinit(http://stackoverflow.com/questions/610818/what-does-beforefieldinit-flag-do、http://csharpindepth.com/Articles/General/Beforefieldinit.aspx です。

  4. 個人的には、この場合は好みの問題だと思います。varできるだけ多く使用する傾向がある人もいれば、反対の人もいます。私は次の場合に使用しようとします:

    • 私はコレクションを扱っています(または、コンパイラにタイプについて伝えるのに多くのテキストが必要です:代わりに:
Dictionary<<OneOfMyClasses, OtherClasss> dictionary = new Dictionary<OneOfMyClasses, OtherClass>();

私は使用する傾向がありますvar

var dictionary = new Dictionary<OneOfMyClasses, OtherClass>();

コードの可読性には影響しないことに注意してください(つまり、実際に何が起こっているのかを理解するのは簡単です)。

于 2012-09-17T06:14:44.203 に答える
2
  1. あるとしても無視できる。それ以外の場合、戻りタイプはコンパイルチェックされます。とにかく、それに基づいて決定を下すべきではありません。
  2. 区別できる限り、好きなだけ。
  3. 静的コンストラクターは型定義の一部です。これらは、タイプが最初に参照されるときに呼び出されます。
  4. どのようなメッセージを受け取っていますか?R#は構成可能です。

編集:(スキートを打ち負かすことはできません)。

于 2012-09-17T06:10:17.370 に答える
0

みんな、ありがとう。しばらく研究に費やした後、誰かを助けるかもしれないいくつかのポイントを追加したいと思います。

免責事項:(以下の点は、codeprojectおよび他のそのようなWebサイトから導き出された(または貼り付けられた)ものです。

1)すべてのクラスは静的コンストラクターを1つだけ持つことができます。

理由:静的コンストラクターはパラメーターなしである必要があります。または単純に、コンストラクターのオーバーロードは許可されていません。また、CLRはこのコンストラクターを呼び出すため、この関数に値を渡すことを制御することはできません。静的コンストラクターを直接呼び出すことはできないため、複数の静的コンストラクターを使用しても意味がありません。

class Test
{
   static Test() {...}
   static Test(int a) {...} //would throw error as "Static constructor must be parameter less"
}

2)静的コンストラクターは、アクセス指定子なしで宣言する必要があります。

理由:ここでも、CLRはクラスのオブジェクトではなく静的コンストラクターを呼び出します。したがって、アクセス指定子は必要ありません。

3)静的コンストラクターは、そのクラスの静的変数に対してのみ動作する必要があります

理由:非静的メンバーはオブジェクトインスタンスに固有です。値が特定のオブジェクトインスタンスに依存/バインドする変数を変更しても意味がありません。

4)静的コンストラクターを使用する必要があるのはなぜですか?良い例を1つ挙げてください

理由:静的コンストラクターを使用できます。たとえば、そのクラスを使用して実行する操作をログに記録する場合などです。MSDNによると、「静的コンストラクターの一般的な使用法は、クラスがログファイルを使用していて、コンストラクターを使用してこのファイルにエントリを書き込む場合です」とのことです。

5)静的コンストラクターが正確に呼び出されるのはいつですか?

回答:ユーザーは、静的コンストラクターがプログラムでいつ実行されるかを制御できません。他の人やMSDNが指摘しているように、「最初のインスタンスが作成される前、または静的メンバーが参照される前に、静的コンストラクターが自動的に呼び出されてクラスが初期化されます。」

6)C#で基本クラスと派生クラスを使用する場合、派生クラスの新しいインスタンスが作成されると、基本クラスコンストラクターが最初に呼び出されますか、それとも派生クラスコンストラクターが最初に呼び出されますか?

回答:基本クラスのコンストラクターが最初に呼び出され、次に派生クラスのコンストラクターが呼び出されます。

コード例

class DerivedClass : ParentClass
{
     public DerivedClass()
     {
         Console.WriteLine("Derived class constructor!");
     }

}

 class ParentClass
{
     public ParentClass()
     {
         System.Console.WriteLine("Parent class constructor!");
     }
}

class Program
{
    static void Main(string[] args)
    {

        var a = new DerivedClass(); //Implicitly Typed local variables.

    }
}

7)上記の例で、両方のコンストラクターにパブリックアクセス指定子があるのはなぜですか?privateを指定するか、アクセス指定子をまったく指定しない場合はどうなりますか?

回答:アクセス指定子を指定しない場合(この場合、コンストラクターは自動的にプライベートになります)、またはプライベートアクセス指定子を使用する場合は常に、クラスをインスタンス化できません。クラスに1つ以上のプライベートコンストラクタが含まれている場合は常に、厳密に(!)インスタンス化することはできません。このタイプのコンストラクターは特殊インスタンスコンストラクターと呼ばれ、通常、クラスのすべてのメンバーが静的メソッドである場合に使用されます。(おそらく、Mathクラスが良い例になるはずです。)

** 8)相続に関するボーナス質問。クラスは2つの異なるクラスから継承しますか?

厳密にはいいえ。C#は直接継承のみをサポートし、もちろんインターフェイスを使用できます。たとえば、

    interface Test
   {
         void abc();
   }  
   class DerivedClass : ParentClass, Test //Test should not be a class. It can be  a interface.
{
     public DerivedClass()
     {
         Console.WriteLine("Derived class constructor!");
     }

     public void abc()
     {
          //should be publicly defined!
          //non public method could not implement from interface Test
     }

}

 class ParentClass
{
     public ParentClass()
     {
         System.Console.WriteLine("Parent class constructor!");
     }
}
于 2012-09-17T16:45:48.330 に答える