C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#での静的コンストラクターの使用は何ですか?


静的コンストラクターは、静的データを初期化するため、または1回だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます。

静的コンストラクターは、コンストラクターがLoadLibraryメソッドを呼び出すことができる場合に、アンマネージコードのラッパークラスを作成するときに役立ちます。静的コンストラクターは、コンパイル時に制約を介してチェックできない型パラメーターに実行時チェックを適用するのにも便利な場所です。

静的コンストラクターには次のプロパティがあります-

  • 静的コンストラクターは、アクセス修飾子を受け取らないか、パラメーターを持ちません。

  • クラスまたは構造体は、静的コンストラクターを1つだけ持つことができます。

  • 静的コンストラクターは継承またはオーバーロードできません。

  • 静的コンストラクターは直接呼び出すことはできず、共通言語ランタイム(CLR)によってのみ呼び出されるようになっています。自動的に呼び出されます。

  • ユーザーは、静的コンストラクターがプログラムでいつ実行されるかを制御できません。

  • 静的コンストラクターは、最初のインスタンスが作成される前、または静的メンバーが参照される前に、クラスを初期化するために自動的に呼び出されます。 staticconstructorは、インスタンスコンストラクターの前に実行されます。タイプの静的コンストラクターは、イベントまたはデリゲートに割り当てられた静的メソッドが呼び出されたときに呼び出され、割り当てられたときは呼び出されません。静的フィールド変数初期化子が静的コンストラクターのクラスに存在する場合、静的コンストラクターの実行の直前にクラス宣言に表示されるテキストの順序で実行されます。

  • 静的フィールドを初期化する静的コンストラクターを提供しない場合、すべての静的フィールドは、C#typesのデフォルト値にリストされているデフォルト値に初期化されます。

  • 静的コンストラクターが例外をスローした場合、ランタイムはそれを2回呼び出すことはなく、プログラムが実行されているアプリケーションドメインの存続​​期間中、型は初期化されないままになります。最も一般的には、静的コンストラクターが型をインスタンス化できない場合、または静的コンストラクター内で発生する未処理の例外の場合に、aTypeInitializationException例外がスローされます。ソースコードで明示的に定義されていない暗黙的な静的コンストラクターの場合、トラブルシューティングでは中間言語(IL)コードの検査が必要になる場合があります。

  • 静的コンストラクターが存在すると、BeforeFieldInit型属性の追加が妨げられます。これにより、実行時の最適化が制限されます。

  • 静的読み取り専用として宣言されたフィールドは、その宣言の一部として、または静的コンストラクターでのみ割り当てることができます。明示的な静的コンストラクターが不要な場合は、実行時の最適化を向上させるために、静的コンストラクターを使用するのではなく、宣言時に静的フィールドを初期化します。

using System;
namespace DemoApplication{
   public class Program{
      static void Main(string[] args){
         Car user = new Car();
         Car user1 = new Car();
         Console.ReadLine();
      }
   }
   public class Car{
      static Car(){
         Console.WriteLine("Static constructor called");
      }
      public Car(){
         Console.WriteLine("Default constructor called");
      }
   }
}

出力

Static constructor called
Default constructor called
Default constructor called

上記の例では、静的コンストラクターが1回だけ呼び出されることがわかります。

using System;
using System.Threading;
namespace DemoApplication{
   public class Car{
      protected static readonly DateTime globalStartTime;
      protected int RouteNumber { get; set; }
      static Car(){
         globalStartTime = DateTime.Now;
         Console.WriteLine($"Static constructor called. Global start time:
         {globalStartTime.ToLongTimeString()}");
      }
      public Car(int routeNum){
         RouteNumber = routeNum;
         Console.WriteLine($"Car {RouteNumber} is created.");
      }
      public void Drive(){
         TimeSpan elapsedTime = DateTime.Now - globalStartTime;
         Console.WriteLine($"Car {this.RouteNumber} is starting its route
         {elapsedTime.Milliseconds} minutes after global start time
         {globalStartTime.ToShortTimeString()}.");
      }
   }
   class TestCar{
      static void Main(){
         Car car1 = new Car(1);
         Car car2 = new Car(2);
         car1.Drive();
         Thread.Sleep(25);
         car2.Drive();
         Console.ReadLine();
      }
   }
}

出力

Static constructor called. Global start time:
7:09:06 AM
Car 1 is created.
Car 2 is created.
Car 1 is starting its route25 minutes after global start time7:09 AM.
Car 2 is starting its route50 minutes after global start time7:09 AM.

  1. Javaでのパラメーター化されたコンストラクターの使用は何ですか?

    コンストラクターはメソッドに似ており、クラスのオブジェクトを作成するときに呼び出されます。通常、コンストラクターはクラスのインスタンス変数を初期化するために使用されます。コンストラクターはクラスと同じ名前であり、戻り型はありません。 パラメーター化されたコンストラクターと引数なしのコンストラクターには、パラメーター化されたコンストラクターがパラメーターを受け入れる2つのタイプがあります。 コンストラクターの主な目的は、クラスのインスタンス変数を初期化することです。パラメータ化されたコンストラクタを使用すると、インスタンス化時に指定された値でインスタンス変数を動的に初期化できます。 publ

  2. Javaでのコンストラクターの使用は何ですか?

    コンストラクターはメソッドに似ており、クラスのオブジェクトを作成するときに呼び出されます。通常、コンストラクターはクラスのインスタンス変数を初期化するために使用されます。コンストラクターはクラスと同じ名前であり、戻り型はありません。 コンストラクターには、パラメーター化されたコンストラクターと引数なしのコンストラクターの2つのタイプがあります。コンストラクターの主な目的は、クラスのインスタンス変数を初期化することです。 例 次の例では、引数なしのコンストラクターを使用して、クラスのインスタンス変数を初期化しようとしています。 public class Test {