フッターコンテンツにスキップ
.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<//code>はインスタンス変数を指し、id<//code>はメソッドのパラメータです。

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の後に配列のインデックスが続きます。

以下は、インデクサーの基本的な例です:

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メソッドを参照するデリゲートの新しいインスタンスを作成します。

thisキーワードをIronPDFで実装する

IronPDFthis キーワードを併用する例を掘り下げてみましょう。IronPDF は、.NET の強力なライブラリで、HTML を使用して PDF ファイルを編集したり 作成したりすることができます

PDFファイルに対して様々な操作を行うためにIronPDFライブラリを使用するPDFHandlerというクラスを考えてみましょう:

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のようなライブラリを扱うとき、コードをより読みやすく理解しやすくします。

C#これ(開発者のための仕組み)図1

結論

C#のthisキーワードは、単純なインスタンス変数からコンストラクタ、拡張メソッド、プロパティ、デリゲート、匿名メソッド、さらにはIronPDFのような一般的なライブラリを使用する際の複雑なコンテキストまで、幅広く使用されています。

IronPDFは無料トライアルを提供しています。 継続することを決定した場合、ライセンスは"$liteLicense "からとなります。 IronPDFはあなたのC#開発ツールキットに加える価値があり、アプリケーションでPDFファイルを扱うタスクを簡素化します。

よくある質問

C#で「this」キーワードがクラス変数とメソッドパラメータをどのように区別できるか?

C#の「this」キーワードは現在のクラスインスタンスを参照するために使用され、同じ名前を共有するクラスレベルの変数とメソッドパラメータを区別できます。これは特にメソッド内の命名の競合を避けるのに役立ちます。

コンストラクタのオーバーロードにおける「this」の重要性は何か?

コンストラクタのオーバーロードでは、『this』を使用して同じクラス内の他のコンストラクタを呼び出せます。これにより、既存のコンストラクタロジックを再利用し、冗長なコードを減らし、一貫性と保守性を確保できます。

C#で拡張メソッドの使用を『this』がどのように促進するか?

拡張メソッドのメソッドパラメータリストでは、『this』キーワードを使用して拡張される型を示します。これにより、開発者は既存の型のソースコードを変更することなく新しいメソッドを追加でき、機能をシームレスに拡張できます。

インデクサーでの『this』の使用方法は?

C#では、『this』はインデクサーとともに使用され、クラスインスタンスを配列のような表記法でアクセスできるプロパティを定義します。これにより、オブジェクト内のデータアクセスの読みやすさと使いやすさが向上します。

なぜ静的メンバーにはC#で「this」を使用できないのか?

『this』キーワードはクラスのインスタンスメンバーを参照しますが、静的メンバーは特定のインスタンスではなく、クラス自体に属します。そのため、「this」は静的メンバーまたはメソッドを参照するためには使用できません。

C#クラスで「this」キーワードがプロパティアクセスをどのように強化するか?

プロパティのgetおよびsetアクセサ内で、『this』キーワードを使用して、現在のクラスインスタンスのプライベートフィールドを参照できます。これにより、操作がクラス自身のフィールドで行われることを明示的に示し、コードの明確さが向上します。

委任のコンテキストでの『this』の役割は何か?

委託のコンテキストでは、『this』により、委任が現在のオブジェクトのメソッドインスタンスを参照できるようになります。これは、イベントハンドリングやコールバックにおいて柔軟性を提供するために、委任を通じてインスタンスメソッドを呼び出すのに重要です。

IronPDFライブラリを使用する際に、「this」がコードの読みやすさをどのように向上させるか?

IronPDFライブラリを使用する場合、「this」はファイルパスなどのインスタンス変数を明確に示すことで、コードをより読みやすくできます。これは、PDFファイルの生成や保存などの操作を行う際に、コードの明確さと保守性を高めるのに特に有用です。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。