.NET 幫助

C# 這個(它如何為開發者工作)

發佈 2023年6月13日
分享:

在 C# 中有一個特別重要的關鍵字,那就是 this 關鍵字。 此關鍵字指的是用於當前 class 實例的參考。 它可以用來區分同名的類別層級變量與方法參數,以及其他用途。 例如,如果您有一個實例變量和一個具有相同名稱的方法參數,this 可以成為救星。!

該關鍵字的基本知識

在一個公共類別中,例如 Employee,您可能會有公共實例變數,例如 idname。 如果您想在方法內為這些實例變數賦值,可能會遇到一個常見問題:如果方法參數與實例變數同名該怎麼辦?

以下是一個解決方案:使用C# 文件中的 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 關鍵字,建構函式多載在同一個類別中成為一種強大的技術。 當一個類別,例如 student 類別,具有多個參數不同的建構子時,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

探討 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()
    {
        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檔案.

考慮一個名為 PDFHandler 的類,它使用 IronPDF 庫來對 PDF 文件執行各種操作:

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# 這是(開發者如何工作)圖1

結論

到目前為止,您應該對 C# 中的 this 關鍵字有了很好的理解,包括其廣泛的用途,從簡單的實例變量到複雜的上下文,例如構造函數、擴展方法、屬性、委託、匿名方法,甚至在使用 IronPDF 等熱門庫時。

請記住,IronPDF 提供一個IronPDF 免費試用因此,您可以測試今天所學的一切。 如果您決定繼續使用,許可證起始價格僅為 \$liteLicense。 IronPDF 可以成為您的 C# 開發工具包中值得一提的補充,簡化在應用程式中處理 PDF 文件的任務。

< 上一頁
C# 新手指南 (開發者使用方式)
下一個 >
C# 列表(開發者使用指南)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >