C# 构造器总结

   在C#中,构造器分为实例构造器和类型构造器,

       一、实例构造器

       构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值

      在一个类中,如果我们没有显示的定义任何构造器,那么C#编译器将定义一个默认的无参构造器,这个无参构造器会简单的调用一个基类的无参构造器,如下面SomeType类

public class SomeType
    {
        public SomeType() : base() { }
    }

    但是当我们基类中没有提供无参构造器怎么办呢,那么这时我们的派生类就必需显示的调用一个基类的构造器,否则编译器会报错。如果类的修饰符为static,编译器根本不会在类的定义中生成默认构造器。

在一个类型中我们是可以定义多个实例构造器的,但是每个构造器必须有不同的签名。

    接下来我们再来谈谈实例构造器的执行,请看如下代码:

internal sealed class SomeType
    {
        private int m_x = 5;
    }

   当我们构造SomeType类时,它的m_x字段被初始化为5,这是因为SomeType的构造器把5存储到字段m_x,再调用基类的构造器,最后调用了自己的构造器。如果你还不懂,请看下面这段代码:

internal sealed class SomeType
    {
        private int m_x = 5;
        private double m_d = 3.1415;
private byte m_b;
public SomeType(string s) { m_d = 10; } }

当我们实例化类型时调用了SomeType(string s)这个构造器时,编译器生成的代码首先会初始化m_x、m_b和m_d的值,再调用基类的构造器,这里的基类就是object,最后再执自己的代码,所以最后三个字段的值为m_x = 5,m_d =10,m_b=0;

说完了引用类型的实例构造器,我们再来谈谈值类型的构造器,个人认为值类型的构造器没有这么重要,只要记得几点就行:

1、CLR确实允许为值类型定义构造器,可以调用构造器来初始化值类型的字段,但必须显示调用才会执行。

2、C#编译器不允许值类型定义无参构造器,但是CLR允许,也就是说,我们可以使用另一种语言定义带有无参构造器的值类型。

       二、类型构造器

     除了实例构造器,CLR还支持类型构造器,也叫静态构造器、类构造器或者类型初始化器。

   1、类型构造器默认没有定义,如果要定义,只能定义一个

   2、类型构造器永远没有参数

   3、必须标记为static,这也是它与实例构造器的区别

   4、C#自动将其标为私有,用显示标记,否则会报错,之所以私有,是为了防止开发人员调用它,因为它的调用是CLR负责的。

   5、类型构造器中的代码只能访问类型的静态字段,并且它的常规用途就是初始化这些字段。

转载于:https://www.cnblogs.com/zhengwei-cq/p/8335106.html

<think>好的,我现在需要回答用户关于C#构造器的作用、功能和使用场景的问题。首先,我得回忆一下构造器的基本概念。构造器,也就是构造函数,在C#中是一个特殊的方法,用于在创建对象时初始化对象的状态。它的主要作用应该包括分配内存、设置初始值等。 接下来,我需要确定构造器的具体功能。比如,默认构造器的作用,带参数的构造器如何初始化对象属性,以及静态构造器的用途。可能还需要提到构造器的重载,允许不同方式初始化对象。 然后,使用场景方面,用户可能想知道在什么情况下需要使用自定义构造函数,或者静态构造函数何时被调用。比如,当创建对象时需要特定的初始化参数,或者类需要在首次被引用时执行某些操作。 用户提供的引用中有工厂模式和观察者模式的例子,虽然这些设计模式中的构造器使用可能不明显,但可以参考工厂类中的构造器如何初始化产品对象。不过用户的问题主要集中在构造器本身,所以需要专注于构造器的基本知识,而不是设计模式。 需要确保回答结构清晰,分点说明作用、功能、使用场景,可能还需要示例代码。同时,根据系统级指令,代码块需要用正确的格式,行内公式用$符号,但这里可能不需要数学公式,主要关注代码示例的正确性。 还要注意用户提到的引用[^1],但引用内容是关于设计模式的,可能与构造器关系不大,所以可能不需要直接引用,但需要确认是否有相关信息可以关联。比如,在工厂模式中,工厂类的构造器可能用于初始化,但用户的问题更基础,所以可能不需要深入设计模式部分。 最后,生成相关问题,考虑用户可能的后续问题,如构造器重载、静态构造器、继承中的构造器调用顺序等。确保问题与主题相关,帮助用户深入理解。 总结步骤: 1. 定义构造器及其基本作用。 2. 列出主要功能:初始化对象、重载、静态构造器。 3. 使用场景:必需参数、资源初始化、单例模式等。 4. 提供代码示例,展示不同构造器的使用。 5. 生成相关问题,如与继承、重载、静态构造器相关的问题。</think>### C# 构造器详解 #### 一、构造器的作用 构造器(构造函数)是类中用于初始化对象的特殊方法,在对象创建时自动执行。核心作用包括: 1. **对象初始化**:为字段赋初始值(如数值类型初始化为$0$,引用类型初始化为$null$) 2. **资源分配**:打开文件/数据库连接等资源准备[^1] 3. **参数验证**:强制要求调用方提供必要参数(如`Person(string name)`必须传入姓名) #### 二、构造器的功能 | 类型 | 语法示例 | 功能特点 | |---------------|-----------------------------|---------------------------------| | 默认构造器 | `public MyClass() { }` | 编译器自动生成(若未显式定义) | | 参数化构造器 | `public MyClass(int x) {...}`| 强制初始化参数 | | 静态构造器 | `static MyClass() { ... }` | 类首次使用时执行,初始化静态成员 | | 私有构造器 | `private MyClass() { ... }` | 实现单例模式/禁止实例化 | #### 三、使用场景 1. **必需参数初始化** ```csharp public class BankAccount { private string _accountNumber; // 必须提供账户号创建实例 public BankAccount(string accountNumber) { _accountNumber = accountNumber ?? throw new ArgumentNullException(); } } ``` 2. **多阶段初始化** ```csharp public class Rectangle { public int Width { get; } public int Height { get; } // 构造器重载 public Rectangle() : this(10, 5) {} // 调用参数化构造器 public Rectangle(int w, int h) { Width = w > 0 ? w : 10; Height = h > 0 ? h : 5; } } ``` 3. **单例模式实现** ```csharp public class Singleton { private static Singleton _instance; // 私有构造器禁止外部实例化 private Singleton() { } public static Singleton Instance => _instance ??= new Singleton(); } ``` #### 四、特殊特性 1. **构造器链**:通过`this`关键字调用其他构造器 ```csharp public class Student { public string Name { get; } public int Age { get; } public Student(string name) : this(name, 18) {} // 年龄默认18岁 public Student(string name, int age) { Name = name; Age = age; } } ``` 2. **继承中的执行顺序**:基类构造器优先执行 ```csharp public class Animal { public Animal() => Console.Write("Animal "); } public class Dog : Animal { public Dog() => Console.Write("Dog"); } // new Dog() 输出 "Animal Dog" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值