집 >백엔드 개발 >C#.Net 튜토리얼 >C# 클래스의 구성방법과 샘플코드에 대한 자세한 설명
이 글에서는 c# 클래스의 생성자 메서드를 주로 소개합니다. 일정한 참고값이 있으니 아래 에디터로 살펴보겠습니다
1. 구성 방법
클래스 구성 방법은 멤버입니다. 클래스 메소드의 일종으로 클래스의 멤버를 초기화하는 기능을 합니다. 클래스의 구성 방법은
1. 정적 구성 방법
2. 인스턴스 생성 방식
1. 정적 생성 방식
클래스의 정적 생성 방식은 클래스 멤버 방식의 일종이다. 클래스이며 해당 기능은 클래스의 정적 멤버 초기화입니다. 아래 코드 예시를 참고하세요:
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(); } } }
우선, 위 코드는 두 개의 클래스를 정의합니다. 3행에서는 Test 클래스를 정의합니다. 클래스를 정의할 때 클래스에 대한 두 가지 액세스 권한 수정자가 있습니다. 하나는 공개이고 다른 하나는 내부입니다. 액세스 수정자가 작성되지 않으면 클래스의 액세스 권한은 기본적으로 내부입니다. 이 액세스 권한의 의미는 이 클래스는 이 어셈블리에서만 액세스할 수 있고 이 어셈블리 외부의 클래스에서는 액세스할 수 없다는 것입니다. 이 클래스가 클래스 라이브러리에 속하는 경우 공개되어야 합니다. 그렇지 않으면 이를 호출하는 어셈블리에서 액세스할 수 없습니다. 코드 라인 5는 정적 필드 멤버를 정의하고, 코드 라인 7은 정적 생성자입니다. 보시다시피 정적 생성 메서드의 특징은 static 키워드가 해당 메서드가 정적임을 나타내므로 여기서는 메서드 이름이 클래스 이름과 정확히 동일해야 한다는 것입니다. 정적 생성 메서드는 매개변수를 포함할 수 없으며 정적 생성 메서드는 반환 값을 가질 수 없습니다. 정적 생성자 메서드의 본문에서 정적 멤버를 초기화할 수 있습니다. 11행은 정적 필드의 값을 출력하는 인스턴스 메서드를 정의합니다. 이 클래스는 16행에서 Program 클래스의 Main(참고: Java에서는 main) 메소드에서 호출되고, 18행에서 이 클래스의 인스턴스가 생성되고, 19행에서 클래스의 인스턴스 메소드가 호출됩니다.
위 코드에서 볼 수 있듯이 클래스의 정적 생성자는 명시적으로 호출되지 않습니다.
아래 위 코드의 실행 결과를 확인하세요.
静态字段 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
보시다시피 static 필드의 값은 증가하지 않았습니다. 이는 정적 생성자 실행의 특징으로, 한 번만 실행됩니다. 어셈블리가 실행되면 애플리케이션 도메인이 생성됩니다. 애플리케이션 도메인에서는 클래스의 정적 생성 메서드가 한 번만 실행됩니다.
코드 예제는 다음과 같이 수정됩니다.
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(); } } }
이 코드는 클래스의 정적 생성 메소드에서 태그 한 줄을 인쇄하며, 클래스의 정적 필드에 대한 액세스 권한은 다음과 같습니다. 또한 공개로 변경되어 클래스 외부에서 호출될 수 있습니다. 정적 필드의 값은 Main 메서드에서 두 번 인쇄됩니다. 클래스 외부에서 클래스의 정적 필드를 호출하려면 참조에 클래스 이름을 사용해야 합니다.
다음은 코드 실행 결과입니다.
类的静态构造方法开始执行 静态字段 a 的值是:1 静态字段 a 的值是:1
이 코드는 클래스의 인스턴스를 생성하지 않습니다. 클래스의 정적 멤버를 참조하기 전에 클래스의 정적 생성자가 호출됩니다. 호출된 클래스의 정적 멤버에는 정적 필드와 정적 메서드가 포함됩니다. 이는 클래스의 정적 생성자 메서드를 호출하기 위한 두 번째 조건입니다.
코드 예제는 다음과 같이 수정됩니다.
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 方法被调用 静态字段 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!