Przejdź do treści stopki
POMOC .NET

C# This (Jak to działa dla programistów)

W języku C# istnieje słowo kluczowe o szczególnym znaczeniu, a jest nim słowo kluczowe this. To słowo kluczowe odnosi się do bieżącej instancji klasy, w której jest używane. Można go wykorzystać między innymi do rozróżnienia zmiennych na poziomie klasy od parametrów metod o tej samej nazwie. Na przykład, jeśli masz zmienną instancji i parametr metody o tej samej nazwie, this może okazać się zbawienne!

Podstawy tego słowa kluczowego

W klasie publicznej, takiej jak na przykład Employee, mogą znajdować się publiczne zmienne instancji, takie jak id lub name. Jeśli chcesz przypisać wartości do tych zmiennych instancji wewnątrz metody, możesz natknąć się na powszechny problem: co zrobić, jeśli parametry metody mają tę samą nazwę co zmienne instancji?

Oto rozwiązanie: Użyj słowa kluczowego this w dokumentacji C#! W poniższym przykładzie metody wewnątrz klasy publicznej Employee słowo kluczowe this służy do rozróżnienia zmiennych instancji od parametrów metody, które mają te same nazwy.

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

W tym przypadku this.id odnosi się do zmiennej instancji, a id jest parametrem metody.

this Słowo kluczowe w przeciążaniu konstruktorów

Dzięki wykorzystaniu słowa kluczowego this przeciążanie konstruktorów staje się potężną techniką w obrębie tej samej klasy. Gdy klasa, taka jak Student, ma wiele konstruktorów z różnymi parametrami, słowo kluczowe this pozwala jednemu konstruktorowi wywołać inny, eliminując potrzebę stosowania zbędnego kodu.

Rozważmy następujący przykład, w którym this jest używane w konstruktorze parametryzowanym:

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

W konstruktorze bezparametrowym this("Default", 0) wywołuje konstruktor parametryczny, ustawiając Default jako nazwę i 0 jako identyfikator.

Odkrywanie this w metodach rozszerzeń

Metody rozszerzeń w języku C# umożliwiają dodawanie metod do istniejących typów bez modyfikowania typu oryginalnego. W tym miejscu słowo kluczowe this działa w magiczny sposób. Jest używany w liście parametrów metody rozszerzenia w odniesieniu do typu, który jest rozszerzany.

Rozważmy następujący przykład metody rozszerzenia:

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

W tym przypadku this string str informuje język C#, że jest to metoda rozszerzenia dla typu string. Teraz możesz użyć tej metody na dowolnym obiekcie typu string, np. if(myString.IsNullOrEmpty()).

this w indeksatorach

Słowo kluczowe this może być również używane do definiowania indeksatorów. Indeksator pozwala na indeksowanie instancji klasy tak samo jak tablic. Umożliwia to dostęp do danych w obiektach przy użyciu notacji indeksowej. W indeksatorze po this następuje indeks tablicy, który zazwyczaj ma postać int index.

Oto podstawowy przykład indeksatora:

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

W tej klasie Test słowo kluczowe this definiuje indeksator, którego można używać do pobierania lub ustawiania wartości w polu instancji array.

this i elementy statyczne

Warto zauważyć, że this nie może być używane do odwoływania się do elementów statycznych lub metod. Wynika to z faktu, że this odnosi się do bieżącej instancji, a elementy statyczne należą do samej klasy, a nie do instancji tej klasy.

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

Pamiętaj więc, że this dotyczy instancji, a nie elementów na poziomie klasy lub elementów statycznych!

this Słowa kluczowe i właściwości

Podobnie jak zmienne instancji i parametry metod, słowo kluczowe this może być również używane z właściwościami. W języku C# właściwość to element składowy, który zapewnia elastyczny mechanizm odczytu, zapisu lub obliczania wartości pola prywatnego. Właściwości można używać tak, jakby były publicznymi elementami danych, ale w rzeczywistości są to specjalne metody zwane akcesorami.

Spójrzmy na prosty przykład wykorzystania this we właściwości:

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

W powyższej klasie słowo kluczowe this jest używane w celu odwołania się do prywatnego ciągu znaków name w akcesorach get i set właściwości Name.

Odkrywanie this i delegatów

Innym miejscem, w którym pojawia się this, są delegaty. Delegat w języku C# jest podobny do wskaźnika funkcji w języku C lub C++. Jest to zmienna typu referencyjnego, która przechowuje odwołanie do metody. Metody delegatów, podobnie jak metody rozszerzeń, mogą używać this w celu uzyskania dostępu do bieżącej instancji.

Oto przykład delegata używającego 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

W klasie student, this.DisplayDetails tworzy nową instancję delegata, która odwołuje się do metody DisplayDetails bieżącego obiektu.

Wdrażanie słowa kluczowego this za pomocą IronPDF

Przyjrzyjmy się przykładowi, w którym można użyć słowa kluczowego this w połączeniu z IronPDF, potężną biblioteką .NET do edycji i tworzenia plików PDF przy użyciu HTML.

Rozważmy klasę o nazwie PDFHandler, która wykorzystuje bibliotekę IronPDF do wykonywania różnych operacji na plikach 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

W tej klasie PDFHandler słowo kluczowe this jest używane w odniesieniu do pola path bieżącej instancji. To pole służy do zapisania wygenerowanego pliku PDF w określonej ścieżce.

Kiedy tworzymy nową instancję PDFHandler i wywołujemy metodę GeneratePDF, słowo kluczowe this pozwala nam wykorzystać path określone podczas tworzenia obiektu:

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

W tym przypadku this sprawia, że kod jest bardziej czytelny i zrozumiały, zwłaszcza w przypadku bibliotek takich jak IronPDF.

C# To (Jak to działa dla programistów) Rysunek 1

Wnioski

Do tej pory powinieneś już dobrze rozumieć znaczenie słowa kluczowego this w języku C#, w tym jego szerokie zastosowanie, od prostych zmiennych instancji po złożone konteksty, takie jak konstruktory, metody rozszerzeń, właściwości, delegaty, metody anonimowe, a nawet podczas korzystania z popularnych bibliotek, takich jak IronPDF.

Pamiętaj, że firma IronPDF oferuje bezpłatną wersję próbną IronPDF, dzięki czemu możesz przetestować wszystko, czego się dzisiaj nauczyłeś. Jeśli zdecydujesz się kontynuować, ceny licencji zaczynają się już od \$liteLicense. IronPDF może być wartościowym dodatkiem do zestawu narzędzi programistycznych C#, upraszczającym obsługę plików PDF w aplikacjach.

Często Zadawane Pytania

W jaki sposób słowo kluczowe „this” rozróżnia zmienne klasy od parametrów metod w języku C#?

Słowo kluczowe „this” w języku C# służy do odwołania się do bieżącej instancji klasy, umożliwiając programistom rozróżnienie między zmiennymi na poziomie klasy a parametrami metod o tej samej nazwie. Jest to szczególnie przydatne w unikaniu konfliktów nazw w obrębie metod.

Jakie znaczenie ma słowo „this” w przeciążaniu konstruktorów?

W przeciążaniu konstruktorów słowo „this” umożliwia jednemu konstruktorowi wywołanie innego konstruktora w tej samej klasie. Pomaga to w redukcji zbędnego kodu poprzez ponowne wykorzystanie istniejącej logiki konstruktora, zapewniając spójność i łatwość konserwacji.

W jaki sposób „this” ułatwia korzystanie z metod rozszerzeń w języku C#?

Słowo kluczowe „this” jest używane w liście parametrów metod rozszerzeń w celu wskazania typu, który jest rozszerzany. Pozwala to programistom na dodawanie nowych metod do istniejących typów bez modyfikowania ich kodu źródłowego, co zapewnia płynne rozszerzenie ich funkcjonalności.

W jaki sposób używa się słowa „this” w indeksatorach?

W języku C# słowo „this” jest używane wraz z indeksatorami do definiowania właściwości, które umożliwiają dostęp do instancji klasy przy użyciu notacji podobnej do tablicowej. Zwiększa to czytelność i użyteczność dostępu do danych w obrębie obiektów.

Dlaczego w języku C# nie można używać słowa „this” w odniesieniu do elementów statycznych?

Słowo kluczowe „this” odnosi się do elementów instancji klasy, podczas gdy elementy statyczne należą do samej klasy, a nie do konkretnej instancji. Dlatego nie można używać słowa „this” do odwoływania się do elementów statycznych lub metod.

W jaki sposób słowo kluczowe „this” usprawnia dostęp do właściwości w klasach C#?

Słowo kluczowe „this” może być używane w akcesorach get i set właściwości w celu odwołania się do pól prywatnych bieżącej instancji klasy. Poprawia to przejrzystość kodu poprzez wyraźne wskazanie, że operacja jest wykonywana na polach należących do klasy.

Jaką rolę odgrywa „this” w kontekście delegatów?

W kontekście delegatów słowo „this” pozwala delegatowi odwołać się do instancji metody bieżącego obiektu. Ma to kluczowe znaczenie dla wywoływania metod instancji za pośrednictwem delegatów, zapewniając elastyczność w obsłudze zdarzeń i wywołaniach zwrotnych.

W jaki sposób „to” może poprawić czytelność kodu podczas korzystania z biblioteki IronPDF?

Podczas korzystania z biblioteki IronPDF słowo „this” może zwiększyć czytelność kodu poprzez wyraźne wskazanie zmiennych instancji, takich jak ścieżki plików. Jest to szczególnie przydatne podczas wykonywania operacji takich jak generowanie i zapisywanie plików PDF, ponieważ poprawia przejrzystość i łatwość utrzymania kodu.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie