C#中this关键字的四种核心用法详解
本文深入解析 C# 中 this 关键字的四种核心用法:利用它定义类的索引器以支持下标访问;在成员方法中将当前实例传递给其他方法;在构造函数重载中使用 this() 调用同类其他构造函数;以及在静态类中作为第一个参数实现针对特定类型的扩展方法。
准备条件:基础类结构定义
为了直观展示 this 的各种行为,我们首先构建两个基础的 C# 类:User(普通用户)和 VIP(会员,继承自 User)。这两个类包含属性、字典集合以及构造函数,为后续演示提供载体。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppConsole
{
/// <summary>
/// 普通用户
/// </summary>
public class User
{
/// <summary>
/// 全局变量:用于存储索引数据
/// </summary>
Dictionary<string, object> dictInfo = null;
/// <summary>
/// 默认构造器
/// </summary>
public User()
{
dictInfo = new Dictionary<string, object>();
}
/// <summary>
/// 构造函数重载
/// </summary>
public User(int UserID, string UserName)
{
// 使用 this. 引用当前实例的属性,区分于同名参数
this.UserName = UserName;
this.ID = UserID;
}
/// <summary>
/// 编号
/// </summary>
public int ID { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
public void Said()
{
new VIP().Say(this);
}
}
/// <summary>
/// 会员类 (继承自 User)
/// </summary>
public class VIP : User
{
/// <summary>
/// 积分
/// </summary>
public int integral { get; set; }
public VIP()
{
ID = 520;
integral = 1000;
}
/// <summary>
/// Say方法
/// </summary>
public void Say([LCQAttribute] User user)
{
Console.WriteLine(string.Format("嗨,大家好!我的编号是{0},大家可以叫我{1}!", user.ID, user.UserName));
}
}
/// <summary>
/// 特性类:指定特性仅适用于方法和方法的参数
/// </summary>
[System.AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter)]
public class LCQAttribute : System.Attribute
{
}
}
第1步:定义索引器 (Indexer)
目的:允许对象像数组一样使用下标 [] 进行访问和修改。
操作:在类内部定义一个名为 this 的类成员。需要指定索引器的参数类型和返回类型。
代码示例:
/// <summary>
/// this,第【1】种用法,索引器
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public object this[string name]
{
get { return dictInfo[name]; }
set { dictInfo[name] = value; }
}
完成状态:创建了一个接受 string 类型参数的索引器,内部基于 Dictionary 实现数据的存取。
第2步:将实例作为参数传递
目的:将当前对象的引用传递给其他类的方法。
操作:在方法体内直接使用 this 关键字作为实参。
代码示例:
/// <summary>
/// this第【2】种用法,当做参数传递
/// </summary>
public void Said()
{
// 将当前 User 实例传给 VIP 对象的 Say 方法
new VIP().Say(this);
}
第3步:构造函数间的调用 this()
目的:在构造函数中复用初始化逻辑,避免代码重复。
操作:在构造函数的参数列表后使用 : this(...) 语法。
代码示例:
/// <summary>
/// this第【3】种用法,通过this()调用无参构造函数
/// </summary>
/// <param name="UserName"></param>
public VIP(string UserName)
: this()
{
this.UserName = UserName;
}
重要参数:: this() 会先执行无参构造函数的内容,再执行当前构造函数的主体。
第4步:定义扩展方法 (Extension Methods)
目的:在不修改原始源代码的情况下,为现有类型添加新方法。
操作:在 static 类中定义 static 方法,并将该方法的第一个参数标记为 this,类型为要扩展的类型。
代码示例:
/// <summary>
/// 静态类,来扩展User类
/// </summary>
public static class Helper
{
/// <summary>
/// 第【4】种用法: this扩展User类
/// </summary>
/// <param name="user"></param>
public static void Sing(this User user)
{
Console.WriteLine(string.Format("嗨,大家好!我的编号是{0},大家可以叫我{1}!", user.ID, user.UserName));
}
}
执行测试与结果观察
为了验证以上用法,我们在控制台主程序中进行综合测试,依次调用各类特性。
static void Main(string[] args)
{
// 声明实体
User user = new User();
user.ID = 1;
user.UserName = "lichaoqiang";
// 测试第一种用法: this用作索引器
user["UserID"] = 1;
Console.WriteLine("第【一】种用法:this用作索引器");
// 测试第二种用法: this用作参数传递
Console.WriteLine("第【二】种用法:this用作参数传递");
user.Said();
// 测试第三种用法: this()
VIP vip = new VIP("yezi");
vip.Said();
Console.WriteLine("第【三】种用法:this()");
// 测试第四种用法: this扩展VIP类(实际上是User的扩展)
Console.WriteLine("第【四】种用法: this扩展VIP类");
user.Sing();
Console.Read();
}
运行上述代码,控制台将依次输出关于索引器调用、参数传递及扩展方法触发的信息,具体结果如下所示:
以上就是
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













