C#中this的用法
this的五大用法
一、限定类似名称隐藏的成员
public class Employee
{
private string alias;
private string name;
public Employee(string name, string alias)
{
this.name = name;
this.alias = alias;
}
}
二、将对象作为参数传递给方法
class Employee
{
private decimal salary = 3000.00m;
public void printEmployee()
{
Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));
}
public decimal Salary
{
get { return salary; }
}
}
class Tax
{
public static decimal CalcTax(Employee E)
{
return 0.08m * E.Salary;
}
}
class MainClass
{
static void Main()
{
Employee E1 = new Employee();
E1.printEmployee();
}
}
三、声明索引器
1.索引器
静态成员函数,因为它们存在于类级别且不属于对象,不具有 this 指针。 在静态方法中引用 this 会生成错误。
索引器允许类或者结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于他们的访问采用参数。
2.索引器与数组的区别
(1)索引器的索引值(Index)类型不限定为整数
用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型可以定义为其他类型。
(2)索引器允许重载
一个类不限定为只能定义一个索引器,只要索引器的函数签名不同,就可以定义多个索引器,可以重载它的功能。
(3)索引器不是一个变量
索引器没有直接定义数据存储的地方,而数组有。索引器具有Get和Set访问器。
3、索引器与属性的区别
(1)索引器以函数签名方式 this 来标识,而属性采用名称来标识,名称可以任意
(2)索引器可以重载,而属性不能重载。
(3)索引器不能用static 来进行声明,而属性可以。索引器永远属于实例成员,因此不能声明为static。
1.以字符串作为下标,对索引器进行存取
2. 多参数索引器及索引器的重载
两个案例点击查看
public class IDXer
{
private string[] name = new string[10];
//索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
public string this[int index]
{
get
{
return name[index];
}
set
{
name[index] = value;
}
}
}
public class Program
{
static void Main(string[] args)
{
//最简单索引器的使用
IDXer indexer = new IDXer();
//“=”号右边对索引器赋值,其实就是调用其set方法
indexer[0] = "张三";
indexer[1] = "李四";
//输出索引器的值,其实就是调用其get方法
Console.WriteLine(indexer[0]);
Console.WriteLine(indexer[1]);
Console.ReadKey();
}
}
四、用this串联构造函数
使用this会调用无参构造函数
// See https://aka.ms/new-console-template for more information
public class Test
{
public Test()
{
Console.WriteLine("无参构造函数");
}
// this()对应无参构造方法Test()
// 先执行Test(),后执行Test(string text)
public Test(string text) : this()
{
Console.WriteLine(text);
Console.WriteLine("有参构造函数");
}
public Test(string text,string name) : this()
{
Console.WriteLine(text);
Console.WriteLine(name);
Console.WriteLine("有两个参构造函数");
}
}
class Program
{
static void Main(string[] args)
{
try
{
Test test = new Test("张三","lisi");
Test test1 = new Test("李四");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
Console.ReadLine();
}
}
}
五、为原始类型扩展方法
当我们需要给一个类增加方法,但又不希望修改这些类,也不希望创建这些类的子类,可以采用扩展方法。扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用
BClass 是需要扩展的类
public static int AFunc(this BClass BName)
{
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构