.NET ヘルプ

C# これは(開発者向けの作業方法)

C#には特別な重要性を持つ特定のキーワードがあり、それがthisキーワードです。 このキーワードは、それが使用されている現在のクラスインスタンスを指します。 これは、同じ名前を共有するクラスレベルの変数とメソッドのパラメータを区別するために使用されます。 たとえば、インスタンス変数と同じ名前のメソッドパラメーターがある場合、this は救い主になることがあります!

このキーワードの基本情報

例えば、Employee のようなパブリッククラスでは、idname のようなパブリックインスタンス変数が含まれているかもしれません。 これらのインスタンス変数にメソッド内で値を割り当てたい場合、一般的な問題に直面するかもしれません: メソッドのパラメーターがインスタンス変数と同じ名前である場合はどうしますか?

こちらが解決策です: this キーワードをC#のドキュメントで使用する ことです! 以下の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
$vbLabelText   $csharpLabel

この場合、this.id はインスタンス変数を指し、id はメソッドのパラメーターです。

コンストラクタのオーバーロードにおけるthisキーワード

this キーワードを活用することで、コンストラクタのオーバーロードは同一クラス内で強力な手法となります。 クラス、例えばstudentクラスのように、異なるパラメータを持つ複数のコンストラクターがある場合、thisキーワードを使用すると、1つのコンストラクターが別のコンストラクターを呼び出すことができ、冗長なコードの必要がなくなります。

次の例を考えてみましょう。ここでは、パラメトリックコンストラクタで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
$vbLabelText   $csharpLabel

パラメータなしのコンストラクターでは、this("Default", 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
$vbLabelText   $csharpLabel

ここで、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
$vbLabelText   $csharpLabel

このクラスTestでは、thisキーワードが定義され、arrayインスタンスフィールドの値を取得または設定するためのインデクサとして使用されます。

this と静的メンバー

thisについて注意すべき点の一つは、静的メンバーやメソッドを参照するために使用できないということです。 これは、this は現在のインスタンスを指し、static メンバーはクラス自体に属し、クラスのインスタンスには属していないためです。

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; }
    }
}
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
$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()
    {
        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
$vbLabelText   $csharpLabel

学生クラスでは、this.DisplayDetails は現在のオブジェクトの DisplayDetails メソッドを参照するデリゲートの新しいインスタンスを作成します。

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

HTMLを使用してPDFファイルを作成および編集する強力な.NETライブラリである[IronPDF](/)と`this`キーワードを組み合わせて使用する可能性のある例を見ていきましょう。

PDFファイルに対して様々な操作を行うためにIronPDFライブラリを使用する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
$vbLabelText   $csharpLabel

この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
$vbLabelText   $csharpLabel

ここで、thisは、特にIronPDFのようなライブラリを扱うときに、コードをより読みやすく理解しやすくします。

C# This(開発者向けの仕組み)図1

結論

現在までに、C#のthisキーワードについて、シンプルなインスタンス変数から、コンストラクタ、拡張メソッド、プロパティ、デリゲート、匿名メソッド、さらにはIronPDFのような人気ライブラリを使用する場合における複雑なコンテキストに至るまで、その広範な利用方法をよく理解しているはずです。

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

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# New(開発者向けの動作)
次へ >
C# リスト (開発者向けの動作方法)