C#中this关键字的四种核心用法详解

Noah
Noah
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析 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();
}

运行上述代码,控制台将依次输出关于索引器调用、参数传递及扩展方法触发的信息,具体结果如下所示:

以上就是的详细内容,更多关于的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表