this 关键字有三大用途:一是构造函数链式调用,必须为首条语句且不可与 base() 共存;二是明确访问当前实例成员,提升可读性;三是定义扩展方法,标记第一个参数类型。

在构造函数里用 this 调用另一个构造函数
当一个类有多个构造函数,且存在重复初始化逻辑时,用 this(...) 可以复用代码,避免手动复制字段赋值。它必须是构造函数的第一条语句。
-
this()必须写在构造函数首行,否则编译报错CS0188 - 不能和
base()同时出现;二者只能选其一 - 调用链不能形成循环,比如 A → B → A,编译器会拒绝
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person() : this("Unknown", 0) { } // 调用下面的构造函数
public Person(string name, int age)
{
Name = name;
Age = age;
}}
衣购网站项目(三层开发)源码
商品查询功能提供了一个快速查看商品的途径。商品查询分为基本查询和高级查询。基本查询:提供关键字和商品大类两种条件的查询,用户可以只填写关键字或者选择商品大类或者关键字和商品大类都填写来查询商品。高级查询:提供关键字,商品大类,商品小类,商品价格范围四种条件的查询,用户可以任意填写其中一种或几种的查询条件来查询想要了解的商品信息。商品查询功能大大的方便了用户,提高了网站的用户体验。(5)帮助系统模块
下载
用 this 明确访问当前实例的字段或属性
当参数名和字段名相同时(常见于 setter 或构造函数),this.fieldName 是区分作用域最直接的方式。C# 不强制要求这么做,但它是清晰、可维护的惯用写法。
- 不加
this也能编译通过(靠命名约定和作用域规则),但容易引发歧义 - 启用 IDE 代码风格检查(如 .NET 的
IDE0003)后,未用this.访问实例成员会被标记为警告 - 只对实例成员有效;静态成员不能用
this访问
public class Counter
{
private int _value;
public Counter(int _value)
{
this._value = _value; // 清晰表明左边是字段,右边是参数
}
public void Increment(int _value)
{
this._value += _value; // 避免误写成 _value += _value(自加参数)
}}
this 作为扩展方法的第一个参数修饰符
扩展方法本质是静态方法,但语法上像实例方法调用。this 出现在第一个参数前,表示“这个方法可以被该类型实例‘点’出来”。它不是真正的实例引用,只是编译器识别扩展方法的标记。
- 扩展方法必须定义在
static class中,且自身是static方法 -
this修饰的参数类型决定了哪些对象能调用它(比如this string→ 所有string实例可用) - 不能在泛型约束中用
this;也不能在普通静态方法中把this当参数写(会编译失败)
public static class StringExtensions
{
public static bool IsEmptyOrWhitespace(this string str)
{
return string.IsNullOrWhiteSpace(str);
}
}
// 使用:
var s = " ";
bool result = s.IsEmptyOrWhitespace(); // 看起来像实例方法
不能在静态上下文中使用 this
this 指向当前实例,而静态方法、静态属性、静态构造函数没有实例上下文。任何在这些地方写 this 的尝试都会导致编译错误 CS0027。
- 连带影响:静态局部函数、
using static导入的类型里也不能用this - 常见误操作:把本该写成实例方法的逻辑误声明为
static,然后卡在this.xxx报错 - 修复方式只有两个:删掉
static,或者把要访问的成员也改成static
真正容易被忽略的是:Lambda 表达式捕获 this 时,如果它被赋给静态字段或长期存活的对象(比如事件监听器),可能造成隐式内存泄漏——this 所指实例无法被 GC 回收。









