ClassName obj = new ClassName(); // 引用类型
int num = new int(); // 值类型(等价于 int num = 0)
场景:
实例化类、结构体或数组(如 List<int> list = new List<int>();)。
为值类型调用默认构造函数(初始化默认值,如 int 初始化为 0)。
(2)作为修饰符(隐藏继承成员)
作用:显式隐藏基类中的同名成员(字段、方法、属性等),消除编译器警告。
语法:
csharp复制代码
public class BaseClass {
public void Method() => Console.WriteLine("Base");
}
public class DerivedClass : BaseClass {
new public void Method() => Console.WriteLine("Derived"); // 隐藏基类方法
}
DerivedClass d = new DerivedClass();
d.Method(); // 输出 "Derived"
((BaseClass)d).Method(); // 输出 "Base"
(3)作为泛型约束(限制类型参数)
作用:要求泛型类型参数必须有公共无参构造函数。
语法:
csharp复制代码
public class Factory<T> where T : new() {
public T Create() => new T(); // 可安全实例化 T
}
场景:泛型工厂模式(如 Factory<Employee>.Create())。
(4)注意事项
命名冲突解决:优先使用 new 修饰符而非忽略警告,明确设计意图。
内存管理:new 运算符为引用类型分配堆内存,需注意垃圾回收机制。
值类型优化:new int() 与 int num = 0 等效,编译器自动优化。
2、this 关键字
(1)四大核心作用
区分成员变量与局部变量:当方法参数与类字段同名时,使用 this 明确指定成员变量:
csharp复制代码
public class Person {
private string name;
public void SetName(string name) {
this.name = name; // this.name 指代成员变量,name 为参数
}
}
链式调用构造函数:在构造函数中使用 this 调用同类其他构造函数,减少代码重复:
csharp复制代码
public class Student {
public string Name;
public int Age;
public Student(string name) : this(name, 18) { } // 调用下方构造函数
public Student(string name, int age) {
Name = name;
Age = age;
}
}
传递当前对象引用:将当前实例作为参数传递给其他方法或类:
csharp复制代码
public class Logger {
public void Log(object obj) { /* 记录对象状态 */ }
}
public class User {
public void Save() {
new Logger().Log(this); // 传递当前 User 实例
}
}
public static class StringExtensions {
public static bool IsNumeric(this string str) { // this 绑定 string 类型
return double.TryParse(str, out _);
}
}
// 调用:"123".IsNumeric();
(2)关键限制与注意事项
场景
是否允许使用 this
说明
静态方法(static)
❌ 禁止
静态方法无实例上下文,使用将导致编译错误
静态属性访问器
❌ 禁止
同静态方法限制
结构体(struct)
⚠️ 受限
this 在结构体中是只读变量(不可修改引用)
构造函数链式调用
✅ 推荐
仅限构造函数首行使用(如 : this(...))
(3)最佳实践与性能建议
避免冗余使用:成员访问若无命名冲突,可省略 this(如 name = "Alice" 替代 this.name = "Alice"),提升代码简洁性。
public class Collection {
private int[] data = new int[10];
public int this[int index] {
get => data[index];
set => data[index] = value;
}
}
// 调用:Collection col = new(); col[0] = 100;
(4)错误用法示例
plain复制代码
public class Example {
private int id;
public static void Print() {
Console.WriteLine(this.id); // 错误:静态方法中禁止使用 this
}
}
❌ 编译错误:CS0120: 非静态字段、方法或属性"Example.id"要求对象引用。
3、base关键字
(1)核心用途
调用基类构造函数
当基类没有无参构造函数时,必须在派生类构造函数中通过base(参数)显式调用基类构造函数
若未显式调用,编译器会尝试调用基类无参构造;若无参构造不存在,则编译报错
csharp复制代码
public class Animal {
public Animal(string name) => Console.WriteLine($"Animal: {name}");
}
public class Dog : Animal {
public Dog(string name) : base(name) { // 显式调用基类构造函数
Console.WriteLine("Dog created");
}
}
调用基类被重写的方法
子类重写基类虚方法(override)后,可通过base.方法名()保留基类逻辑
适用于扩展而非完全替换基类方法的场景
csharp复制代码
public class Base {
public virtual void Show() => Console.Write("Hello");
}
public class Derived : Base {
public override void Show() {
base.Show(); // 调用基类方法
Console.Write(" World"); // 扩展新逻辑
}
}
// 输出:"Hello World"
访问基类被隐藏的成员
当子类使用new关键字隐藏基类同名成员时,可通过base访问基类原始成员
csharp复制代码
public class Parent { public int Value = 100; }
public class Child : Parent {
new public int Value = 200; // 隐藏基类成员
public void PrintBase() => Console.WriteLine(base.Value); // 输出100
}
(2)关键限制与注意事项
适用场景限制:
仅在实例构造函数、实例方法或属性访问器中有效,静态方法中不可使用。
只能访问直接基类的成员,无法跨级访问更高层基类。
构造函数调用规则:
若基类存在无参构造函数,子类可省略: base()(编译器自动调用);
若基类只有有参构造,子类必须显式调用base并传参。
与this的区别:this指向当前类实例,base指向直接基类实例。两者可结合使用(如this.Name vs base.Name)。
(3)典型场景速查表
场景
代码示例
作用
初始化基类字段
public Child(int x) : base(x) { }
确保基类数据正确初始化
扩展基类方法逻辑
base.Method(); /*新增逻辑*/
复用基类方法并增强功能
解决父子类成员名冲突
int val = base.Field;
访问被隐藏的基类成员
注意:滥用base可能破坏封装性。优先通过重写设计扩展逻辑,而非频繁绕过继承层级。
4、static关键字
(1)核心作用
全局共享性
修饰的成员(变量/方法)不属于对象实例,而是属于类本身
所有实例共享同一份内存空间,修改一处即全局生效
csharp复制代码
class Counter {
public static int Count = 0; // 所有实例共享
public Counter() { Count++; }
}
// 测试
var c1 = new Counter();
var c2 = new Counter();
Console.WriteLine(Counter.Count); // 输出 2
直接访问性:无需实例化类,通过 类名.成员 直接访问
Math.Pow(2, 3); // 经典静态方法调用
(2)五大使用场景
静态成员变量
特点:
类加载时初始化,生命周期 = 应用程序域生存期
默认值:数值型为 0,引用类型为 null
典型用途:
全局配置项(如日志开关)
跨实例共享数据(如计数器)
静态方法
规则:
只能访问静态成员,不可调用实例方法/属性
不能使用 this 或 base 关键字
典型用途:
工具类方法(如 File.ReadAllText())
工厂模式创建对象
csharp复制代码
public static Logger CreateLogger() {
return new FileLogger();
}
静态类
强制约束:
类本身必须标记 static,且仅包含静态成员
不可被实例化或继承(本质是 sealed abstract 类)
典型用途:
工具类(如 System.Math)
扩展方法容器(需配合 this 参数)
静态构造函数
特性:
在类首次被访问时自动执行,且仅执行一次
无参数和访问修饰符
典型用途:初始化静态成员或加载资源
csharp复制代码
class ConfigLoader {
public static string ApiKey;
static ConfigLoader() {
ApiKey = File.ReadAllText("key.txt"); // 初始化
}
}