.NET 帮助

C# 这 (它是怎么为开发人员工作的)

发布 2023年六月13日
分享:

C# 中有一个特别重要的关键字,那就是 this 关键字。这个关键字指的是使用它的当前类实例。除其他外,它还可用于区分同名的类级变量和方法参数。例如,如果您有一个同名的实例变量和一个同名的方法参数,this 就会成为您的救星!

该关键词的基本原理

在一个公有类(例如Employee)中,可能会有一些公有实例变量,如idname。如果要在方法中为这些实例变量赋值,可能会遇到一个常见问题:如果方法参数与实例变量同名,该怎么办?

这里有一个解决方案:使用 this "关键字! 在下面这个公有类 Employee 中的方法示例中,使用了 this 关键字来区分实例变量和同名的方法参数。

public void Display(int id, string name)
{
    this.id = id;
    this.name = name;
}
public void Display(int id, string name)
{
    this.id = id;
    this.name = name;
}
Public Sub Display(ByVal id As Integer, ByVal name As String)
	Me.id = id
	Me.name = name
End Sub
VB   C#

在这种情况下,this.id 指的是实例变量,id 是方法参数。

构造函数重载中的 this 关键字

通过利用 this 关键字,构造函数重载成为同一类中的一项强大技术。当一个类(如 "学生 "类)有多个参数各不相同的构造函数时,"this "关键字允许一个构造函数调用另一个构造函数,从而消除了多余代码的需要。

请看下面的例子,this 被用于一个参数化的构造函数中:

public class Student
{
    private string name;
    private int id;

    public Student() : this("Default", 0)
    {
    }

    public Student(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
}
public class Student
{
    private string name;
    private int id;

    public Student() : this("Default", 0)
    {
    }

    public Student(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
}
Public Class Student
	Private name As String
	Private id As Integer

	Public Sub New()
		Me.New("Default", 0)
	End Sub

	Public Sub New(ByVal name As String, ByVal id As Integer)
		Me.name = name
		Me.id = id
	End Sub
End Class
VB   C#

在无参数构造函数中,this("默认",0)调用参数化构造函数,将Default` 设置为名称和 ID。

在扩展方法中探索 `this

C# 中的扩展方法提供了一种在不修改原始类型的情况下为现有类型添加方法的方法。这就是关键字 this 发挥神奇作用的地方。在扩展方法的参数列表中,它被用来指代被扩展的类型。

请看下面的扩展方法示例:

public static class StringExtensions
{
    public static bool IsNullOrEmpty(this string str)
    {
        return string.IsNullOrEmpty(str);
    }
}
public static class StringExtensions
{
    public static bool IsNullOrEmpty(this string str)
    {
        return string.IsNullOrEmpty(str);
    }
}
Public Module StringExtensions
	<System.Runtime.CompilerServices.Extension> _
	Public Function IsNullOrEmpty(ByVal str As String) As Boolean
		Return String.IsNullOrEmpty(str)
	End Function
End Module
VB   C#

这里,this string str 告诉 C# 这是字符串类型的扩展方法。现在,您可以在任何字符串对象上使用此方法,如 if(myString.IsNullOrEmpty()).

this 在索引器中

关键字 this 也可用于定义索引器。索引器允许类的实例像数组一样被索引。这有助于使用类似索引的符号访问对象中的数据。在索引器中,"this "后面是数组索引,通常是 "int index"。

下面是一个索引器的基本示例:

public class Test
{
    private int [] array = new int [100];

    public int this [int index]
    {
        get { return array [index]; }
        set { array [index] = value; }
    }
}
public class Test
{
    private int [] array = new int [100];

    public int this [int index]
    {
        get { return array [index]; }
        set { array [index] = value; }
    }
}
Public Class Test
	Private array(99) As Integer

	Default Public Property Item(ByVal index As Integer) As Integer
		Get
			Return array (index)
		End Get
		Set(ByVal value As Integer)
			array (index) = value
		End Set
	End Property
End Class
VB   C#

在这个类 Test 中,关键字 this 定义了一个索引器,可用于获取或设置 array 实例字段中的值。

this和静态成员

关于 this 需要注意的一点是,它不能用于引用静态成员或方法。这是因为 this 指的是当前实例,而静态成员属于类本身,而不是类的实例。

public class Program
{
    public static void Main(string [] args)
    {
        // Can't use `this` here, because 'Main' is a static method.
    }
}
public class Program
{
    public static void Main(string [] args)
    {
        // Can't use `this` here, because 'Main' is a static method.
    }
}
Public Class Program
	Public Shared Sub Main(ByVal args() As String)
		' Can't use `this` here, because 'Main' is a static method.
	End Sub
End Class
VB   C#

因此,请记住,"this "是用于实例的,而不是用于类级或静态成员的!

this 关键字和属性

与实例变量和方法参数一样,this 关键字也可用于属性。在 C# 中,属性是一种成员,它为读取、写入或计算私有字段的值提供了灵活的机制。属性可以像公共数据成员一样使用,但它们实际上是一种特殊的方法,称为访问器。

让我们来看一个在属性中使用 this 的简单例子:

public class Employee
{
    private string name;

    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }
}
public class Employee
{
    private string name;

    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }
}
Public Class Employee
'INSTANT VB NOTE: The field name was renamed since Visual Basic does not allow fields to have the same name as other class members:
	Private name_Conflict As String

	Public Property Name() As String
		Get
			Return Me.name_Conflict
		End Get
		Set(ByVal value As String)
			Me.name_Conflict = value
		End Set
	End Property
End Class
VB   C#

在上述类中,"this "关键字用于在 "Name "属性的 get 和 set 访问器中引用私有字符串 "name"。

Exploring this and Delegates

另一个出现 this 的地方是委托。C# 中的委托类似于 C 或 C++ 中的函数指针。它是一个引用类型的变量,用于保存方法的引用。委托方法就像扩展方法一样,可以使用 this 访问当前实例。

下面是一个使用 this 的委托示例:

public delegate void DisplayDelegate();

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public void Display()
    {
        DisplayDelegate displayDelegate = new DisplayDelegate(this.DisplayDetails);
        displayDelegate();
    }

    private void DisplayDetails()
    {
        Console.WriteLine("ID: " + Id + ", Name: " + Name);
    }
}
public delegate void DisplayDelegate();

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public void Display()
    {
        DisplayDelegate displayDelegate = new DisplayDelegate(this.DisplayDetails);
        displayDelegate();
    }

    private void DisplayDetails()
    {
        Console.WriteLine("ID: " + Id + ", Name: " + Name);
    }
}
Public Delegate Sub DisplayDelegate()

Public Class Student
	Public Property Id() As Integer
	Public Property Name() As String

	Public Sub Display()
		Dim displayDelegate As New DisplayDelegate(AddressOf Me.DisplayDetails)
		displayDelegate()
	End Sub

	Private Sub DisplayDetails()
		Console.WriteLine("ID: " & Id & ", Name: " & Name)
	End Sub
End Class
VB   C#

在学生类中,"this.DisplayDetails "会创建一个新的委托实例,该委托会引用当前对象的 "DisplayDetails "方法。

使用 IronPDF 实现this关键字

让我们举例说明如何将 this 关键字与 IronPDF是一个功能强大的 .NET 库,用于编辑和 使用 HTML 创建 PDF 文件.

考虑使用 IronPDF 库对 PDF 文件执行各种操作的名为 PDFHandler 的类:

using IronPdf;

public class PDFHandler
{
    private string path;

    public PDFHandler(string path)
    {
        this.path = path;
    }

    public void GeneratePDF(string content)
    {
        var Renderer = new IronPdf.ChromePdfRenderer();
        var PDF = Renderer.RenderHtmlAsPdf(content);
        PDF.SaveAs(this.path);
    }
}
using IronPdf;

public class PDFHandler
{
    private string path;

    public PDFHandler(string path)
    {
        this.path = path;
    }

    public void GeneratePDF(string content)
    {
        var Renderer = new IronPdf.ChromePdfRenderer();
        var PDF = Renderer.RenderHtmlAsPdf(content);
        PDF.SaveAs(this.path);
    }
}
Imports IronPdf

Public Class PDFHandler
	Private path As String

	Public Sub New(ByVal path As String)
		Me.path = path
	End Sub

	Public Sub GeneratePDF(ByVal content As String)
		Dim Renderer = New IronPdf.ChromePdfRenderer()
		Dim PDF = Renderer.RenderHtmlAsPdf(content)
		PDF.SaveAs(Me.path)
	End Sub
End Class
VB   C#

在这个 PDFHandler 类中,this 关键字用于引用当前实例的 path 字段。该字段用于将生成的 PDF 保存到指定路径。

当我们创建一个新的 PDFHandler 实例并调用 GeneratePDF 方法时,this 关键字允许我们使用对象创建过程中指定的 path

class Program
{
    static void Main(string [] args)
    {
        PDFHandler pdfHandler = new PDFHandler("C:\\ThisKeyowrd.pdf");
        pdfHandler.GeneratePDF("Hello World!");
    }
}
class Program
{
    static void Main(string [] args)
    {
        PDFHandler pdfHandler = new PDFHandler("C:\\ThisKeyowrd.pdf");
        pdfHandler.GeneratePDF("Hello World!");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim pdfHandler As New PDFHandler("C:\ThisKeyowrd.pdf")
		pdfHandler.GeneratePDF("Hello World!")
	End Sub
End Class
VB   C#

在这里,"this "使代码更可读、更易懂,尤其是在处理 IronPDF 这样的库时。

C# This(如何为开发人员工作) 图 1

结论

现在,您应该对 C# 中的 this 关键字有了很好的了解,包括其广泛的用途,从简单的实例变量到复杂的上下文,如构造函数、扩展方法、属性、委托、匿名方法,甚至在使用 IronPDF 等流行库时。

请记住,IronPDF 提供了一个 免费试用因此,您可以对今天所学的一切进行测试。如果您决定继续使用,许可证起价仅为 $749。IronPDF 可以简化应用程序中处理 PDF 文件的任务,是 C# 开发工具包中值得一用的新成员。

< 前一页
C# 新手指南(开发人员如何使用)
下一步 >
C# 列表 (开发人员如何使用)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,840,061 查看许可证 >