ホームページ >バックエンド開発 >C#.Net チュートリアル >C#クラスの構築方法とサンプルコードを詳しく解説

C#クラスの構築方法とサンプルコードを詳しく解説

黄舟
黄舟オリジナル
2017-03-28 13:06:471477ブラウズ

この記事では主にc#クラスの構築方法を紹介します。一定の参考値があるので、以下のエディタで見てみましょう

1. 構築メソッド

クラスの構築メソッドは、クラスのメンバーメソッドの一種であり、その機能は操作を実行することです。クラスのメンバーに対する初期化操作。クラスの建設方法は次のように分けられます。1。

static

建設方法2。インスタンス建設方法

1.静的構造方法クラスはクラス A タイプのメンバー メソッドであり、その機能はクラス内の静的メンバーを初期化することです。以下のコード例を参照してください:

using System;
namespace LycheeTest {
 class Test {
 //定义一个静态成员变量
 private static int a;
 //定义静态构造函数
 static Test() {
  //初始化静态成员变量
  a = 11;
 }
 public void Show() {
  Console.WriteLine("静态字段 a 的值是:{0}", a);
 }
 }
 class Program {
 static void Main(string[] args) {
  Test t = new Test();
  t.Show();
  Console.ReadKey();
 }
 }
}

まず第一に、上記のコードは 2 つのクラスを定義します。 3 行目ではクラス Test を定義しています。クラスを定義する場合、クラスには 2 つのアクセス修飾子があり、1 つはパブリック、もう 1 つは内部です。アクセス修飾子が記述されていない場合、クラスのアクセス許可はデフォルトで内部になります。 このアクセス許可の意味は、このクラスにはこのアセンブリのみがアクセスでき、このアセンブリの外部のクラスはアクセスできないということです。このクラスが

クラス ライブラリ に属している場合は、パブリックである必要があります。そうでない場合、そのクラスを呼び出すアセンブリはそのクラスにアクセスできません。コードの 5 行目は静的フィールド メンバーを定義し、コードの 7 行目は静的コンストラクターです。ご覧のとおり、静的構築メソッドの特徴は、static キーワードがメソッドが静的であることを示し、メソッド名がクラス名とまったく同じである必要があることです。ここでは大文字と小文字に注意してください。 静的構築メソッドにはパラメータを含めることはできず、静的構築メソッドには戻り値を含めることはできません

。静的コンストラクター メソッドの本体で静的メンバーを初期化できます。 11 行目では、静的フィールドの値を出力するインスタンス メソッドを定義しています。このクラスは、16 行目で Program クラスの Main (注: Java では main) メソッドで呼び出され、18 行目でこのクラスのインスタンスが作成され、19 行目でクラスのインスタンス メソッドが呼び出されます。

上記のコードからわかるように、クラスの静的コンストラクターは明示的に呼び出されません。

以下の上記コードの実行結果をご覧ください:

静的構築メソッドが実際に実行されていることがわかります。上記の例は、クラスのインスタンスが作成されると、そのクラスの静的構築メソッドが自動的に呼び出される条件の 1 つです。

静的コンストラクターの呼び出し順序は、静的フィールドの初期化子の後です。

つまり、最初のステップは静的フィールドのデフォルト値を設定すること、第二ステップは静的フィールドの初期値設定項目を実行すること、そして第三ステップはクラスの静的コンストラクターメソッドを呼び出すことです。 静态字段 a 的值是:11

前のコード例を変更してみましょう。コードは次のとおりです。

using System;
namespace LycheeTest{
 class Test {
 private static int a;
 static Test() {
  a++;
 }
 public void Show() {
  Console.WriteLine("静态字段 a 的值是:{0}", a);
  14
 }
 }
 class Program {
 static void Main(string[] args) {
  Test t = new Test();
  t.Show();
  Test t1 = new Test();
  t.Show();
  Console.ReadKey();
 }
 }
}

このコードは、静的構築メソッドを変更し、メソッド本体の静的フィールド a をインクリメントします。次に、コードの 17 行目で、クラスの別のインスタンスが作成され、クラスのインスタンス メソッドが再度呼び出されます。

以下の実行結果を見てください:

静态字段 a 的值是:1 
静态字段 a 的值是:1

静的フィールドの値が増加していないことがわかります。これは静的コンストラクター実行の特徴であり、一度だけ実行されます。アセンブリが実行されると、アプリケーション ドメインが作成されます。アプリケーション ドメインでは、クラスの静的構築メソッドが 1 回だけ実行されます。

コード例は次のように変更されます:

using System;
namespace LycheeTest {
 class Test {
 public static int a;
 static Test() {
  Console.WriteLine("类的静态构造方法开始执行");
  a++;
 }
 public void Show() {
  Console.WriteLine("静态字段 a 的值是:{0}", a);
 }
 }
 class Program {
 static void Main(string[] args) {
  Console.WriteLine("静态字段 a 的值是:{0}", Test.a);
  Console.WriteLine("静态字段 a 的值是:{0}", Test.a);
  Console.ReadKey();
 }
 }
}

このコードは、クラスの静的構築メソッド内のタグの行を出力し、クラスの静的フィールドのアクセス権も public に変更され、これにより許可されます。クラス外からアクセスできます。静的フィールドの値は、Main メソッドで 2 回出力されます。クラスの外部でクラスの静的フィールドを呼び出すには、

reference

にクラス名を使用する必要があることに注意してください。

以下はコードの実行結果です:

类的静态构造方法开始执行
静态字段 a 的值是:1
静态字段 a 的值是:1

このコードはクラスのインスタンスを作成しません。クラスの静的メンバーを参照する前に、クラスの静的コンストラクターが呼び出されます。呼び出されるクラスの静的メンバーには、静的フィールドと静的メソッドが含まれます。これは、クラスの静的コンストラクター メソッドを呼び出すための 2 番目の条件です。

コード例は次のように変更されます:

using System;
namespace LycheeTest {
 class Program {
 private static int a;
 static Program() {
  Console.WriteLine("类的静态构造方法被调用");
  a = 11;
 }
 static void Main(string[] args) {
  Console.WriteLine("Main 方法被调用");
  Console.WriteLine("静态字段 a 的值是:{0}", a);
  Console.ReadKey();
 }
 }
}

このコードは、Main メソッドを含むクラスで静的フィールドと静的コンストラクターを定義します。 Main メソッドも静的メソッドであるため、クラスの静的コンストラクターが呼び出され、それがクラスのエントリ ポイント メソッドとなるため、Main メソッドとクラスの静的コンストラクターの間で、誰が最初にそれを呼び出すのでしょうか。まずコードの実行結果を見てみましょう:

类的静态构造方法被调用
Main 方法被调用
静态字段 a 的值是:11

コードの実行結果から、クラスのエントリ ポイント メソッドが依然として静的メソッドであるため、静的コンストラクター メソッドが静的メンバーの前に最初に呼び出されることがわかります。と呼ばれます。したがって、クラスの静的コンストラクターは、クラスの Main メソッドの前に呼び出されると結論付けることができます。

では、クラスの静的コンストラクターを明示的に呼び出すことはできるのでしょうか?以下のコード例を見てください:

using System;
namespace LycheeTest {
 class Program {
 private static int a;
 static Program() {
  Console.WriteLine("类的静态构造方法被调用");
  a = 11;
 }
 static void Main(string[] args) {
  Program();
  Console.ReadKey();
 }
 }
}

在这段代码中的第 10 行显式调用了类的静态构造方法,这时编译器会报错。

2.实例构造函数

类的实例构造方法是类的成员方法的一种,它的作用是对类的实例成员进行初始化操作。实例构造方法可以实现重载,在创建类的实例时,可以显式的指定不同的参数来调用重载的不同的实例构造方法。下面请看代码实例:

using System;
namespace LycheeTest {
 class Program {
 private static int a;
 private int b = 12;
 private string c = "Hello World";
 static Program() {
  Console.WriteLine("类的静态构造方法被调用");
  a = 11;
 }
 public Program(int a, string s) {
  Console.WriteLine("带二个参数的构造方法被调用");
  this.b = a;
  this.c = s;
 }
 public Program(int a) : this(a, "通过 this 关键字调用构造方法") {
  Console.WriteLine("带一个参数的构造方法被调用");
 }
 public void Show() {
  Console.WriteLine("静态字段 a 的值是:{0}", a);
  Console.WriteLine("实例字段 b 的值是:{0}", b);
  Console.WriteLine("实例字段 c 的值是:{0}", c);
 }
 static void Main(string[] args) {
  Program p1 = new Program(33, "这是创建的实例 P1");
  Program p2 = new Program(34);
  p1.Show();
  p2.Show();
  Console.ReadKey();
 }
 }

这段代码的第 4 行、第 5 行和第 6 行分别定义了三个字段成员,第 4 行是静态字段,第 5 行和第 6 行代码都有初始值设定项。代码的第 8 行就是一个实例构造方法的定义,实例构造方法也是以类名作为方法名,它没有返回值, 在方法名前面是访问权限修饰符,可以使用的访问权限修饰符包括 public、private 和 protected。其中的 protected 意味着构造方法只能在此类内部访问。实例构造方法可以带参数。 第 12 行代码的实例构造方法使用两个传入的参数对实例字段进行了赋值。第 17 行代码定义了带一个参数的实例构造方法,它和前一个实例构造方法形成了重载。实例构造方法可以通过 this 关键字调用其他的实例构造方法,方法就是在参数列表的后面使用冒号然后接 this 关键字, 然后再跟参数列表,这个参数列表要匹配另一个重载的实例构造方法。第 17 行的构造方法只有一个参数, 它将这个参数通过 this 关键字传递给了另一个构造方法,在用 this 调用另一个构造方法的时候,为其同时传入了一个字符串参数。第 24 行的实例方法打印类的字段成员的值。在 Main 方法中,第 26 行代码和第 27 行代码分别定义了两个实例,它们使用 new 关键字调用了不同的实例构造方法。第 28 行和第 29 行分别调用实例方法打印类的静态字段和实例的两个字段成员的值。

下面先来看代码的执行结果:

类的静态构造方法被调用 带二个参数的构造方法被调用 带二个参数的构造方法被调用 带一个参数的构造方法被调用 
静态字段 a 的值是:11 
实例字段 b 的值是:33
实例字段 c 的值是:这是创建的实例 P1 静态字段 a 的值是:11
实例字段 b 的值是:34
实例字段 c 的值是:通过 this 关键字调用构造方法

现在用执行结果来介绍实例构造方法的执行过程,当第 26 行代码创建类的实例时,类的静态字段首先被设置成默认值,因为没有字段的初始值设定项,所以接着就执行类的静态构造方法。这时静态字段 a 被 设置成 11。因为第 26 行代码使用 new 调用了带有两个参数的实例构造方法,所以首先实例字段 b 被设置为 0,实例字段 c 被设置为 null。然后执行字段的初始值设定项,b 被赋值为 12,c 被赋值为“Hello World”。接 下来执行实例构造方法体中的第一个语句,“带二个参数的构造方法被调用”这个字符串被打印。接下来 实例 p1 的字段 b 被设置为传入的参数 33,注意构造方法的形参 a 在这里覆盖了类的静态字段 a。也就是说, 这时起作用的是实例构造方法的局部变量 a。然后实例字段 c 被设置为字符串"这是创建的实例 P1"。第 27 行代码使用 new 关键字调用了带一个参数的实例构造方法,在调用时,首先属于 p2 的实例字段 b 被设置为 0,实例字段 c 被设置为 null。然后执行字段的初始值设定项,b 被赋值为 12,c 被赋值为“Hello World”。接下来执行的是 this 引用的带两个参数的实例构造方法,"带二个参数的构造方法被调用"这个 字符串被打印。然后 b 被设置为 34,c 被设置为"通过 this 关键字调用构造方法"。最后,代码控制又返回 来执行带一个参数的实例构造方法体中的打印语句,"带一个参数的构造方法被调用"这个字符串被打印。 至此,实例构造方法的执行完毕。接下来的代码打印静态字段的值,可以看到两个实例打印出来的静态字段值是一样的,但是它们的实 例字段的值各不相同。

可选参数和命名参数也可以用于实例构造方法,下面看代码实例:

using System;
namespace LycheeTest {
 class Program {
 private int b;
 private string c;
 public Program(int a = 12, string s = "") {
  this.b = a;
  this.c = s;
 }
 public void Show() {
  Console.WriteLine("实例字段 b 的值是:{0}", b);
  Console.WriteLine("实例字段 c 的值是:{0}", c);
 }
 static void Main(string[] args) {
  Program p1 = new Program(); //构造方法的两个参数都采用默认值
  Program p2 = new Program(34); //构造方法的 string 类型参数采用默认值
  Program p3 = new Program(23, "Hello World"); //构造方法的两个参数采用传入参数
  Program p4 = new Program(s: "今天的天气真好"); //采用命名参数,另一个参数 a 采用默认值
  p1.Show();
  p2.Show();
  p3.Show();
  p4.Show();
  Console.ReadKey();
 }
 }
}

代码的第 6 行定义了一个带有可选参数和命名参数的构造方法,然后第 15 创建了一个类的实例,在构造方法中没有传入任何参数,这时,构造方法的两个参数都采用默认值。第 16 行代码为构造方法传入了一个 int 类型的参数,这时,另一个 string 类型的参数采用默认值。 第 17 行代码传入了两个参数,构造方法的两个参数都使用了这两个传入的参数。第 18 行代码使用了命名参数指定传入的参数是 string 类型的参数,并将它传递给形参 s。这时另一 个 int 类型的参数采用默认值。第 19 行到第 23 行代码打印类的实例字段的值。这段代码的执行结果如下:

实例字段 b 的值是:12 
实例字段 c 的值是: 
实例字段 b 的值是:34 
实例字段 c 的值是: 
实例字段 b 的值是:23
实例字段 c 的值是:Hello World 实例字段 b 的值是:12
实例字段 c 的值是:今天的天气真好

以上がC#クラスの構築方法とサンプルコードを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。