构造方法 #
一、构造方法概述 #
构造方法是在创建对象时自动调用的特殊方法,用于初始化对象。
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