构造方法 #

一、构造方法概述 #

构造方法是在创建对象时自动调用的特殊方法,用于初始化对象。

1.1 构造方法特点 #

  • 方法名与类名相同
  • 没有返回类型
  • 可以重载
  • 自动调用

1.2 默认构造方法 #

csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var person = new Person();

二、实例构造方法 #

2.1 无参构造方法 #

csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public Person()
    {
        Name = "未知";
        Age = 0;
    }
}

var person = new Person();

2.2 有参构造方法 #

csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

var person = new Person("张三", 25);

2.3 构造方法重载 #

csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
    
    public Person()
    {
        Name = "未知";
        Age = 0;
        Email = "";
    }
    
    public Person(string name) : this()
    {
        Name = name;
    }
    
    public Person(string name, int age) : this(name)
    {
        Age = age;
    }
    
    public Person(string name, int age, string email) : this(name, age)
    {
        Email = email;
    }
}

2.4 调用基类构造方法 #

csharp
public class Animal
{
    public string Name { get; }
    
    public Animal(string name)
    {
        Name = name;
    }
}

public class Dog : Animal
{
    public string Breed { get; }
    
    public Dog(string name, string breed) : base(name)
    {
        Breed = breed;
    }
}

var dog = new Dog("旺财", "金毛");

三、静态构造方法 #

3.1 基本用法 #

csharp
public class Configuration
{
    public static string ConnectionString { get; }
    public static int MaxConnections { get; }
    
    static Configuration()
    {
        ConnectionString = "Server=localhost";
        MaxConnections = 100;
    }
}

3.2 执行时机 #

csharp
public class Example
{
    static Example()
    {
        Console.WriteLine("静态构造方法执行");
    }
    
    public Example()
    {
        Console.WriteLine("实例构造方法执行");
    }
}

var e1 = new Example();
var e2 = new Example();

四、私有构造方法 #

4.1 单例模式 #

csharp
public class Singleton
{
    private static Singleton _instance;
    private static readonly object _lock = new();
    
    private Singleton() { }
    
    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    _instance ??= new Singleton();
                }
            }
            return _instance;
        }
    }
}

var singleton = Singleton.Instance;

4.2 工厂模式 #

csharp
public class Product
{
    public string Name { get; }
    public decimal Price { get; }
    
    private Product(string name, decimal price)
    {
        Name = name;
        Price = price;
    }
    
    public static Product Create(string name, decimal price)
    {
        if (string.IsNullOrEmpty(name))
            throw new ArgumentException("名称不能为空");
        
        if (price < 0)
            throw new ArgumentException("价格不能为负数");
        
        return new Product(name, price);
    }
}

var product = Product.Create("笔记本电脑", 5999);

五、主构造函数(C# 12+) #

5.1 基本语法 #

csharp
public class Person(string name, int age)
{
    public string Name { get; } = name;
    public int Age { get; } = age;
    
    public void Introduce()
    {
        Console.WriteLine($"我是{name},今年{age}岁");
    }
}

var person = new Person("张三", 25);

5.2 可变性 #

csharp
public class Person(string name, int age)
{
    public string Name { get; set; } = name;
    public int Age { get; set; } = age;
}

5.3 参数验证 #

csharp
public class Person(string name, int age)
{
    public string Name { get; } = !string.IsNullOrEmpty(name) 
        ? name 
        : throw new ArgumentException("名称不能为空");
    
    public int Age { get; } = age >= 0 && age <= 150 
        ? age 
        : throw new ArgumentException("年龄无效");
}

5.4 与继承 #

csharp
public class Animal(string name);

public class Dog(string name, string breed) : Animal(name)
{
    public string Breed { get; } = breed;
}

六、对象初始化器 #

6.1 与构造方法配合 #

csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
    
    public Person(string name)
    {
        Name = name;
    }
}

var person = new Person("张三")
{
    Age = 25,
    Email = "zhangsan@example.com"
};

6.2 集合初始化 #

csharp
public class Team
{
    public string Name { get; set; }
    public List<string> Members { get; set; }
}

var team = new Team
{
    Name = "开发组",
    Members = new List<string> { "张三", "李四", "王五" }
};

七、析构函数 #

7.1 基本语法 #

csharp
public class ResourceHolder
{
    private IntPtr _handle;
    
    public ResourceHolder()
    {
        _handle = AllocateResource();
    }
    
    ~ResourceHolder()
    {
        FreeResource(_handle);
    }
    
    private IntPtr AllocateResource() => IntPtr.Zero;
    private void FreeResource(IntPtr handle) { }
}

7.2 推荐使用IDisposable #

csharp
public class ResourceHolder : IDisposable
{
    private IntPtr _handle;
    private bool _disposed = false;
    
    public ResourceHolder()
    {
        _handle = AllocateResource();
    }
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
            }
            
            FreeResource(_handle);
            _disposed = true;
        }
    }
    
    ~ResourceHolder()
    {
        Dispose(false);
    }
    
    private IntPtr AllocateResource() => IntPtr.Zero;
    private void FreeResource(IntPtr handle) { }
}

八、实战示例 #

8.1 订单类 #

csharp
public class Order
{
    private static int _nextId = 1;
    
    public int Id { get; }
    public DateTime CreatedAt { get; }
    public List<OrderItem> Items { get; }
    public decimal TotalAmount => Items.Sum(i => i.Subtotal);
    
    public Order()
    {
        Id = _nextId++;
        CreatedAt = DateTime.Now;
        Items = new List<OrderItem>();
    }
    
    public Order(IEnumerable<OrderItem> items) : this()
    {
        Items.AddRange(items);
    }
    
    public void AddItem(OrderItem item)
    {
        Items.Add(item);
    }
    
    public void RemoveItem(int productId)
    {
        Items.RemoveAll(i => i.ProductId == productId);
    }
}

public record OrderItem(int ProductId, string ProductName, decimal Price, int Quantity)
{
    public decimal Subtotal => Price * Quantity;
}

8.2 配置类 #

csharp
public class DatabaseConfig
{
    public string Server { get; }
    public string Database { get; }
    public string UserId { get; }
    public string Password { get; }
    public int Timeout { get; }
    
    public DatabaseConfig(string server, string database, string userId, string password)
        : this(server, database, userId, password, 30)
    {
    }
    
    public DatabaseConfig(string server, string database, string userId, string password, int timeout)
    {
        Server = server ?? throw new ArgumentNullException(nameof(server));
        Database = database ?? throw new ArgumentNullException(nameof(database));
        UserId = userId ?? throw new ArgumentNullException(nameof(userId));
        Password = password ?? throw new ArgumentNullException(nameof(password));
        Timeout = timeout > 0 ? timeout : throw new ArgumentException("超时时间必须大于0");
    }
    
    public string GetConnectionString()
    {
        return $"Server={Server};Database={Database};User Id={UserId};Password={Password};Timeout={Timeout}";
    }
}

九、总结 #

构造方法要点:

类型 说明
无参构造 默认初始化
有参构造 参数初始化
静态构造 类初始化
私有构造 限制实例化
主构造 C# 12+简化语法

下一步,让我们学习封装!

最后更新:2026-03-26