跳至页脚内容
.NET 帮助

C# This(开发者如何使用)

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

该关键词的基础知识

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

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

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

    public void Display(int id, string name)
    {
        // Use `this.id` to refer to the instance variable, 
        // and `id` for the method parameter.
        this.id = id;
        this.name = name;
    }
}
public class Employee
{
    private int id;
    private string name;

    public void Display(int id, string name)
    {
        // Use `this.id` to refer to the instance variable, 
        // and `id` for the method parameter.
        this.id = id;
        this.name = name;
    }
}
Public Class Employee
	Private id As Integer
	Private name As String

	Public Sub Display(ByVal id As Integer, ByVal name As String)
		' Use `this.id` to refer to the instance variable, 
		' and `id` for the method parameter.
		Me.id = id
		Me.name = name
	End Sub
End Class
$vbLabelText   $csharpLabel

在本例中,this.id 指的是实例变量,id 是方法参数。

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

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

请看下面的示例,在参数化构造函数中使用了 this

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

    public Student() : this("Default", 0)
    {
        // Default constructor delegates to the parameterized constructor
        // with "Default" as the name and 0 as the id.
    }

    public Student(string name, int id)
    {
        // Assign the parameters to the instance variables
        this.name = name;
        this.id = id;
    }
}
public class Student
{
    private string name;
    private int id;

    public Student() : this("Default", 0)
    {
        // Default constructor delegates to the parameterized constructor
        // with "Default" as the name and 0 as the id.
    }

    public Student(string name, int id)
    {
        // Assign the parameters to the instance variables
        this.name = name;
        this.id = id;
    }
}
Public Class Student
	Private name As String
	Private id As Integer

	Public Sub New()
		Me.New("Default", 0)
		' Default constructor delegates to the parameterized constructor
		' with "Default" as the name and 0 as the id.
	End Sub

	Public Sub New(ByVal name As String, ByVal id As Integer)
		' Assign the parameters to the instance variables
		Me.name = name
		Me.id = id
	End Sub
End Class
$vbLabelText   $csharpLabel

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

探索扩展方法中的 this.

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

下面是一个扩展方法的例子:

public static class StringExtensions
{
    // This extension method can be called on any string instance
    public static bool IsNullOrEmpty(this string str)
    {
        return string.IsNullOrEmpty(str);
    }
}
public static class StringExtensions
{
    // This extension method can be called on any string instance
    public static bool IsNullOrEmpty(this string str)
    {
        return string.IsNullOrEmpty(str);
    }
}
Public Module StringExtensions
	' This extension method can be called on any string instance
	<System.Runtime.CompilerServices.Extension> _
	Public Function IsNullOrEmpty(ByVal str As String) As Boolean
		Return String.IsNullOrEmpty(str)
	End Function
End Module
$vbLabelText   $csharpLabel

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

this 在索引器中。

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

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

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

    // Define an indexer for the class
    public int this[int index]
    {
        get { return array[index]; }
        set { array[index] = value; }
    }
}
public class Test
{
    private int[] array = new int[100];

    // Define an indexer for the class
    public int this[int index]
    {
        get { return array[index]; }
        set { array[index] = value; }
    }
}
Public Class Test
	Private array(99) As Integer

	' Define an indexer for the class
	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
$vbLabelText   $csharpLabel

在该类 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
$vbLabelText   $csharpLabel

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

this关键字和属性

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

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

public class Employee
{
    private string name;

    public string Name
    {
        get { return this.name; }
        set { this.name = value; } // Use `this` to refer to the instance variable
    }
}
public class Employee
{
    private string name;

    public string Name
    {
        get { return this.name; }
        set { this.name = value; } // Use `this` to refer to the instance variable
    }
}
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 ' Use `this` to refer to the instance variable
	End Property
End Class
$vbLabelText   $csharpLabel

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

探索 this 和委托。

另一个出现 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()
    {
        // `this.DisplayDetails` refers to the method instance of the current object.
        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()
    {
        // `this.DisplayDetails` refers to the method instance of the current object.
        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()
		' `this.DisplayDetails` refers to the method instance of the current object.
		Dim displayDelegate As New DisplayDelegate(AddressOf Me.DisplayDetails)
		displayDelegate()
	End Sub

	Private Sub DisplayDetails()
		Console.WriteLine("ID: " & Id & ", Name: " & Name)
	End Sub
End Class
$vbLabelText   $csharpLabel

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

使用 IronPDF 实现 this 关键字。

让我们深入探讨一个示例,您可能会将 this 关键字与 IronPDF 结合使用,IronPDF 是一个功能强大的 .NET 库,用于编辑和 使用 HTML 创建 PDF 文件

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

using IronPdf;

public class PDFHandler
{
    private string path;

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

    public void GeneratePDF(string content)
    {
        // Creating a renderer to convert HTML content to PDF
        var Renderer = new IronPdf.ChromePdfRenderer();
        var PDF = Renderer.RenderHtmlAsPdf(content);

        // Save the generated PDF to the path specified by the current instance
        PDF.SaveAs(this.path);
    }
}
using IronPdf;

public class PDFHandler
{
    private string path;

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

    public void GeneratePDF(string content)
    {
        // Creating a renderer to convert HTML content to PDF
        var Renderer = new IronPdf.ChromePdfRenderer();
        var PDF = Renderer.RenderHtmlAsPdf(content);

        // Save the generated PDF to the path specified by the current instance
        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)
		' Creating a renderer to convert HTML content to PDF
		Dim Renderer = New IronPdf.ChromePdfRenderer()
		Dim PDF = Renderer.RenderHtmlAsPdf(content)

		' Save the generated PDF to the path specified by the current instance
		PDF.SaveAs(Me.path)
	End Sub
End Class
$vbLabelText   $csharpLabel

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

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

class Program
{
    static void Main(string[] args)
    {
        // Initialize PDFHandler with a specified file path
        PDFHandler pdfHandler = new PDFHandler("C:\\ThisKeyword.pdf");
        pdfHandler.GeneratePDF("Hello World!");
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Initialize PDFHandler with a specified file path
        PDFHandler pdfHandler = new PDFHandler("C:\\ThisKeyword.pdf");
        pdfHandler.GeneratePDF("Hello World!");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Initialize PDFHandler with a specified file path
		Dim pdfHandler As New PDFHandler("C:\ThisKeyword.pdf")
		pdfHandler.GeneratePDF("Hello World!")
	End Sub
End Class
$vbLabelText   $csharpLabel

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

!a href="/static-assets/pdf/blog/csharp-this/csharp-this-1.webp">C# This(如何为开发人员工作)图 1

结论

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

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

常见问题解答

如何在 C# 中使用 'this' 关键字区分类变量和方法参数?

在 C# 中,'this' 关键字用于引用当前类实例,允许开发人员区分具有相同名称的类级别变量和方法参数。这样特别有助于避免方法内部的命名冲突。

在构造函数重载中,'this' 的重要性是什么?

在构造函数重载中,'this' 使一个构造函数能够调用同一类中的另一个构造函数。这有助于通过重用现有的构造函数逻辑来减少冗余代码,确保一致性和可维护性。

'this' 如何促进 C# 中扩展方法的使用?

'this' 关键字用于扩展方法的方法参数列表中,以指示要扩展的类型。这允许开发人员在不修改源代码的情况下向现有类型添加新方法,从而无缝地扩展其功能。

在索引器中,'this' 是如何使用的?

在 C# 中,'this' 与索引器一起使用,以定义允许使用类似数组的符号访问类实例的属性。这增强了对象内部数据访问的可读性和可用性。

为什么不能在 C# 中使用 'this' 与静态成员一起?

'this' 关键字指的是类的实例成员,而静态成员属于类本身,而不是任何特定实例。因此,'this' 不能用于引用静态成员或方法。

'this' 关键字在 C# 类中的属性访问中增强了什么?

'this' 关键字可以在属性的 get 和 set 访问器中使用,以引用当前类实例的私有字段。通过明确表示操作是在类自己的字段上进行的,这提高了代码的清晰度。

'this' 在委托上下文中扮演什么角色?

在委托上下文中,'this' 允许委托引用当前对象的方法实例。这对于通过委托调用实例方法至关重要,提供了灵活的事件处理和回调。

在使用 IronPDF 库时,'this' 如何提高代码的可读性?

使用 IronPDF 库时,'this' 可以通过清楚地指示实例变量(如文件路径)来提高代码的可读性。这在执行生成和保存 PDF 文件等操作时特别有用,因为它增强了代码的清晰度和可维护性。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,是 C# PDF 技术的先锋工程师。作为 Iron Software 核心代码库的原始开发者,自公司成立以来,他就塑造了公司的产品架构,并与首席执行官 Cameron Rimington 一起将其转变成一家公司,拥有50多人,服务于 NASA、特斯拉和全球政府机构。

Jacob 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。