Altbilgi içeriğine atla
.NET YARDıM

C# İndeksleyiciler (Geliştiriciler İçin Nasıl Çalışır)

C#'de bir indeksleyici, bir sınıf veya yapının örneklerinin dizi erişim operatörü [] kullanılarak erişilmesini sağlayan özel bir tür özelliktir. Indeksleyiciler, 'akıllı diziler' oluşturmak veya veriyi basitleştirilmiş bir sözdizimi ile kapsüller hale getirmek için çok kullanışlı olabilirler. Dizilerle kullanacağınız gibi, bir sınıf örneğini dizin üzerinden erişebilir şekilde kullanabilmenize olanak tanırlar. Bu makale, pratik örneklerle C# indeksleyicilerini nasıl bildireceğimizi ve kullanacağımızı inceleyecek. Makalenin sonunda IronPDF kütüphanesini de inceleyeceğiz.

Temel Indeksleyici Sözdizimi

Bir indeksleyici, bir sınıf veya yapı içinde this anahtar kelimesini kullanan ve ardından indeksleyici bildirimine sahip olan bir örnek üyedir. Ayrıca parametre türlerini ve dönüş türünü belirtirsiniz. Bir indeksleyici örneği üyesi için genel sözdizimi şöyle görünür:

public return_type this[parameter_type index]
{
    get
    {
        // Code to return data
    }
    set
    {
        // Code to set data
    }
}
public return_type this[parameter_type index]
{
    get
    {
        // Code to return data
    }
    set
    {
        // Code to set data
    }
}
Default Public Property Item(ByVal index As parameter_type) As return_type
	Get
		' Code to return data
	End Get
	Set(ByVal value As return_type)
		' Code to set data
	End Set
End Property
$vbLabelText   $csharpLabel

Burada, return_type indeksleyicinin döndüreceği değer türüdür, örneğin bir tamsayı değeri, ve parameter_type genellikle bir int olan indeksin türüdür. get erişimci belirtilen indeksteki değeri döndürür, ve set blok kodu erişimcisi o indekse bir değer atar.

Indeksleyici Bildirimi ve Kullanımı

C# sınıfı içinde bir indeksleyici uygulamanın temel bir illüstrasyonunu inceleyeceğiz. Bir dizi stringi kapsülleyen Program sınıfını düşünün.

class Program
{
    private string[] values = new string[5]; // Array with 5 elements
    public string this[int index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[index] = value;
        }
    }
}
class Program
{
    private string[] values = new string[5]; // Array with 5 elements
    public string this[int index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[index] = value;
        }
    }
}
Friend Class Program
	Private values(4) As String ' Array with 5 elements
	Default Public Property Item(ByVal index As Integer) As String
		Get
			Return values(index)
		End Get
		Set(ByVal value As String)
			values(index) = value
		End Set
	End Property
End Class
$vbLabelText   $csharpLabel

Yukarıdaki kodda:

  • Program sınıfı values adlı bir dizi dizisi içerir.
  • string this[int index] indeksleyici bildirimidir, burada int index dizinin elemanlarına erişmek için kullanılan indeks parametreli özelliktir.
  • get erişimci belirtilen indeksteki indekslenmiş değeri döndürür, ve set erişimci o indekse bir indekslenmiş değer atar.

Bu, Program sınıfının bir örneğini oluşturabileceğiniz ve indeksleyiciyi kullanarak onun values dizisine erişebileceğiniz anlamına gelir, bu şekilde:

class Program
{
    static void Main()
    {
        Program program = new Program();
        // Set values using indexer
        program[0] = "First";
        program[1] = "Second";
        // Access values using indexer
        Console.WriteLine(program[0]); // Output: First
        Console.WriteLine(program[1]); // Output: Second
    }
}
class Program
{
    static void Main()
    {
        Program program = new Program();
        // Set values using indexer
        program[0] = "First";
        program[1] = "Second";
        // Access values using indexer
        Console.WriteLine(program[0]); // Output: First
        Console.WriteLine(program[1]); // Output: Second
    }
}
Friend Class Program
	Shared Sub Main()
		Dim program As New Program()
		' Set values using indexer
		program(0) = "First"
		program(1) = "Second"
		' Access values using indexer
		Console.WriteLine(program(0)) ' Output: First
		Console.WriteLine(program(1)) ' Output: Second
	End Sub
End Class
$vbLabelText   $csharpLabel

Bu kodda, indeksleyicinin values dizisine erişmek için nasıl basit bir sözdizimi sağladığını, bir dizideki elemanlara erişme şeklinize benzer şekilde göreceksiniz.

get ve set Erişimcilerini Anlama

Indeksleyici içindeki get ve set erişimcileri, özelliklerle yaptığınız gibi veri alma ve atama yapmanıza olanak tanıyan blok kod gibidir. Ana fark, indeksleyicilerinin veri gruplarıyla çalışmak için bir indeks parametresi kullanmasıdır, bireysel veri üyeleriyle değil.

get bloğu belirtilen indeksteki veriyi döndürmekten sorumluyken, set bloğu belirtilen indekse veri atar. Bu bilgilerinizi pekiştirmek için başka bir örnek:

class StudentRecords
{
    private string[] studentNames = new string[3];
    public string this[int index]
    {
        get
        {
            if (index >= 0 && index < studentNames.Length)
            {
                return studentNames[index];
            }
            return "Invalid Index";
        }
        set
        {
            if (index >= 0 && index < studentNames.Length)
            {
                studentNames[index] = value;
            }
        }
    }
    public int Length
    {
        get { return studentNames.Length; }
    }
}
class StudentRecords
{
    private string[] studentNames = new string[3];
    public string this[int index]
    {
        get
        {
            if (index >= 0 && index < studentNames.Length)
            {
                return studentNames[index];
            }
            return "Invalid Index";
        }
        set
        {
            if (index >= 0 && index < studentNames.Length)
            {
                studentNames[index] = value;
            }
        }
    }
    public int Length
    {
        get { return studentNames.Length; }
    }
}
Friend Class StudentRecords
	Private studentNames(2) As String
	Default Public Property Item(ByVal index As Integer) As String
		Get
			If index >= 0 AndAlso index < studentNames.Length Then
				Return studentNames(index)
			End If
			Return "Invalid Index"
		End Get
		Set(ByVal value As String)
			If index >= 0 AndAlso index < studentNames.Length Then
				studentNames(index) = value
			End If
		End Set
	End Property
	Public ReadOnly Property Length() As Integer
		Get
			Return studentNames.Length
		End Get
	End Property
End Class
$vbLabelText   $csharpLabel

Bu örnekte:

  • StudentRecords sınıfı, öğrencilerin isimlerini tutan özel bir string[] studentNames dizisine sahiptir.
  • Indeksleyici, değeri ayarlamadan veya almadan önce indeksin dizinin sınırları içinde olup olmadığını kontrol eder.
  • Bir int türü Length özelliği, dizinin uzunluğuna erişim sağlar.

Bu sınıfı Main metodunda şu şekilde kullanabilirsiniz:

class Program
{
    public static void Main()
    {
        StudentRecords records = new StudentRecords();
        // Set values using indexer
        records[0] = "John";
        records[1] = "Jane";
        records[2] = "Bob";
        // Access values using indexer
        for (int i = 0; i < records.Length; i++)
        {
            Console.WriteLine(records[i]);
        }
    }
}
class Program
{
    public static void Main()
    {
        StudentRecords records = new StudentRecords();
        // Set values using indexer
        records[0] = "John";
        records[1] = "Jane";
        records[2] = "Bob";
        // Access values using indexer
        for (int i = 0; i < records.Length; i++)
        {
            Console.WriteLine(records[i]);
        }
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim records As New StudentRecords()
		' Set values using indexer
		records(0) = "John"
		records(1) = "Jane"
		records(2) = "Bob"
		' Access values using indexer
		For i As Integer = 0 To records.Length - 1
			Console.WriteLine(records(i))
		Next i
	End Sub
End Class
$vbLabelText   $csharpLabel

Genel Bir Indeksleyici Oluşturma

Indeksleyicilere sahip genel sınıflar da oluşturabilir, böylece kodunuz birden fazla veri türünü işleyebilir. İşte genel bir indeksleyici ile bir genel sınıfın basit bir örneği:

class GenericClass<t>
{
    private T[] elements = new T[5];
    public T this[int index]
    {
        get
        {
            return elements[index];
        }
        set
        {
            elements[index] = value;
        }
    }
    public int Length
    {
        get { return elements.Length; }
    }
}
class GenericClass<t>
{
    private T[] elements = new T[5];
    public T this[int index]
    {
        get
        {
            return elements[index];
        }
        set
        {
            elements[index] = value;
        }
    }
    public int Length
    {
        get { return elements.Length; }
    }
}
Option Strict On



Public Class GenericClass(Of T)
    Private elements As T() = New T(4) {}

    Default Public Property Item(index As Integer) As T
        Get
            Return elements(index)
        End Get
        Set(value As T)
            elements(index) = value
        End Set
    End Property

    Public ReadOnly Property Length As Integer
        Get
            Return elements.Length
        End Get
    End Property
End Class
$vbLabelText   $csharpLabel

Bu kodda:

  • GenericClass sınıfı, herhangi bir veri türü ile çalışabilecek bir indeksleyici tanımlar.
  • this[int index] indeksleyici, türü ne olursa olsun dizideki elemanlara erişmenize olanak tanır.

Artık GenericClass farklı veri türleri ile Main metodunda kullanabilirsiniz:

class Program
{
    public static void Main()
    {
        GenericClass<int> intArray = new GenericClass<int>();
        intArray[0] = 10;
        intArray[1] = 20;

        GenericClass<string> stringArray = new GenericClass<string>();
        stringArray[0] = "Hello";
        stringArray[1] = "World";

        // Output the integer array values
        for (int i = 0; i < intArray.Length; i++)
        {
            Console.WriteLine(intArray[i]);
        }

        // Output the string array values
        for (int i = 0; i < stringArray.Length; i++)
        {
            Console.WriteLine(stringArray[i]);
        }
    }
}
class Program
{
    public static void Main()
    {
        GenericClass<int> intArray = new GenericClass<int>();
        intArray[0] = 10;
        intArray[1] = 20;

        GenericClass<string> stringArray = new GenericClass<string>();
        stringArray[0] = "Hello";
        stringArray[1] = "World";

        // Output the integer array values
        for (int i = 0; i < intArray.Length; i++)
        {
            Console.WriteLine(intArray[i]);
        }

        // Output the string array values
        for (int i = 0; i < stringArray.Length; i++)
        {
            Console.WriteLine(stringArray[i]);
        }
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim intArray As New GenericClass(Of Integer)()
		intArray(0) = 10
		intArray(1) = 20

		Dim stringArray As New GenericClass(Of String)()
		stringArray(0) = "Hello"
		stringArray(1) = "World"

		' Output the integer array values
		For i As Integer = 0 To intArray.Length - 1
			Console.WriteLine(intArray(i))
		Next i

		' Output the string array values
		For i As Integer = 0 To stringArray.Length - 1
			Console.WriteLine(stringArray(i))
		Next i
	End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF ve C# Indeksleyici Kullanımı

C# Indeksleyiciler (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - IronPDF

IronPDF, .NET uygulamalarında PDF oluşturma, düzenleme ve dönüştürme için tasarlanmış bir C# kütüphanesidir. PDF'lerle çalışmayı geliştiriciler için HTML'den PDF oluşturma, PDF dosyalarını değiştirme ve birleştirme, yazdırma ve imza ekleme gibi ileri düzey işlevleri programatik olarak ele alma gibi konularda basitleştirir.

IronPDF'yi indeksleyicilerden yararlanarak C# programlarınızda kullanarak dinamik olarak PDF içeriklerini oluşturabilir ve yönetebilirsiniz. Örneğin, HTML dizelemesini tutan bir sınıfınız olduğunda, bir indeksleyiciyi kullanarak HTML girişlerinden her biri için PDF oluşturmak isterseniz. Bu yaklaşım, PDF oluşturma işlemini kolaylaştırırken kodunuzu düzenli ve sezgisel tutar.

using IronPdf;
using System;

class PdfGenerator
{
    private string[] htmlTemplates = new string[3];
    public string this[int index]
    {
        get { return htmlTemplates[index]; }
        set { htmlTemplates[index] = value; }
    }

    public void GeneratePdf(int index, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this[index]); // Access HTML string using indexer
        pdfDocument.SaveAs(outputPath);
    }
}

class Program
{
    public static void Main()
    {
        PdfGenerator pdfGen = new PdfGenerator();
        // Populate HTML templates
        pdfGen[0] = "<h1>First Document</h1><p>This is the first PDF.</p>";
        pdfGen[1] = "<h1>Second Document</h1><p>This is the second PDF.</p>";
        pdfGen[2] = "<h1>Third Document</h1><p>This is the third PDF.</p>";

        // Generate PDFs using the indexer
        pdfGen.GeneratePdf(0, "first.pdf");
        pdfGen.GeneratePdf(1, "second.pdf");
        pdfGen.GeneratePdf(2, "third.pdf");

        Console.WriteLine("PDFs generated successfully.");
    }
}
using IronPdf;
using System;

class PdfGenerator
{
    private string[] htmlTemplates = new string[3];
    public string this[int index]
    {
        get { return htmlTemplates[index]; }
        set { htmlTemplates[index] = value; }
    }

    public void GeneratePdf(int index, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this[index]); // Access HTML string using indexer
        pdfDocument.SaveAs(outputPath);
    }
}

class Program
{
    public static void Main()
    {
        PdfGenerator pdfGen = new PdfGenerator();
        // Populate HTML templates
        pdfGen[0] = "<h1>First Document</h1><p>This is the first PDF.</p>";
        pdfGen[1] = "<h1>Second Document</h1><p>This is the second PDF.</p>";
        pdfGen[2] = "<h1>Third Document</h1><p>This is the third PDF.</p>";

        // Generate PDFs using the indexer
        pdfGen.GeneratePdf(0, "first.pdf");
        pdfGen.GeneratePdf(1, "second.pdf");
        pdfGen.GeneratePdf(2, "third.pdf");

        Console.WriteLine("PDFs generated successfully.");
    }
}
Imports IronPdf
Imports System

Friend Class PdfGenerator
	Private htmlTemplates(2) As String
	Default Public Property Item(ByVal index As Integer) As String
		Get
			Return htmlTemplates(index)
		End Get
		Set(ByVal value As String)
			htmlTemplates(index) = value
		End Set
	End Property

	Public Sub GeneratePdf(ByVal index As Integer, ByVal outputPath As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(Me(index)) ' Access HTML string using indexer
		pdfDocument.SaveAs(outputPath)
	End Sub
End Class

Friend Class Program
	Public Shared Sub Main()
		Dim pdfGen As New PdfGenerator()
		' Populate HTML templates
		pdfGen(0) = "<h1>First Document</h1><p>This is the first PDF.</p>"
		pdfGen(1) = "<h1>Second Document</h1><p>This is the second PDF.</p>"
		pdfGen(2) = "<h1>Third Document</h1><p>This is the third PDF.</p>"

		' Generate PDFs using the indexer
		pdfGen.GeneratePdf(0, "first.pdf")
		pdfGen.GeneratePdf(1, "second.pdf")
		pdfGen.GeneratePdf(2, "third.pdf")

		Console.WriteLine("PDFs generated successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Indeksleyiciler (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - Konsol Çıktısı

Sonuç

C# indeksleyicileri, sınıflarınızın ve yapılarınızdaki diziler gibi davranmasını sağlayan yararlı bir özelliktir. Basitleştirilmiş sözdizimi ve esnek veri erişimi sunarak, daha sezgisel ve okunabilir kod oluşturabilirsiniz. Dize, tam sayı veya diğer veri türleriyle çalışıyor olmanız önemli değil, indeksleyiciler veri yapınızı kapsülleyip temiz ve verimli bir şekilde dizinleri kullanarak erişim sağlar.

IronPDF, ücretsiz bir deneme lisansı ile başlamanızı kolaylaştırır; size PDF oluşturma, düzenleme ve render etme için ihtiyaç duyduğunuz tüm özelliklere erişim sağlar. Yazılımı keşfetmek için zaman ayırabilirsiniz ve memnun olduğunuzda, lisanslar $799'dan başlayan fiyatlarla mevcuttur.

Sıkça Sorulan Sorular

C#'da bir dizinleyici nedir?

C#'da bir dizinleyici, bir sınıf veya yapı örneklerinin dizi erişim operatörü [] kullanılarak erişilmesine olanak tanıyan özel bir özellik türüdür. Bu, bir sınıfın örneklerinin dizi gibi kullanılmasını sağlar.

C#'da temel bir dizinleyici nasıl ilan edilir?

C#'da temel bir dizinleyici, 'this' anahtar kelimesi ve ardından dizinleyici beyanı ile ilan edilir. Parametre türlerini ve dönüş türünü belirtmelisiniz. Örneğin: public return_type this[parameter_type index] { get; set; }.

Bir dizinleyicide 'get' ve 'set' erişimcilerinin amacı nedir?

Bir dizinleyicide 'get' erişimcisi belirtilen bir dizinle verileri almak için kullanılırken, 'set' erişimcisi belirtilen bir dizine veri atamak için kullanılır. Bunlar, özellik erişimcileri gibi çalışır ancak veri koleksiyonları için kullanılır.

C# sınıfında bir dizinleyici örneği verebilir misiniz?

Elbette. Özel bir dizi içeren 'Program' sınıfını düşünün. Dizinleyici, bu diziye bir tamsayı indeksi kullanarak erişime izin verir. Örneğin: public string this[int index] { get { return values[index]; } set { values[index] = value; } }.

C#'da bir genel dizinleyici nasıl oluşturulur?

C#'de bir genel indisleyici, bir genel sınıf içinde oluşturulabilir. Örneğin, GenericClass sınıfı, herhangi bir veri türünü işleyebilen bir indisleyici içerir. İndisleyici public T this[int index] { get; set; } şeklinde bildirilmiştir.

C#'da PDF oluşturmayı kolaylaştırmak için dizinleyicileri nasıl kullanabilirsiniz?

IronPDF gibi bir kütüphane kullanarak, indeksörleri bir sınıfta depolanan HTML şablonlarını yönetmek ve erişmek için kullanabilirsiniz ve bunlar daha sonra PDF belgelerine dönüştürülür. Bu yaklaşım, birden fazla HTML kaynağından dinamik PDF'ler oluşturma sürecini basitleştirir.

Bir PDF kütüphanesini bir indeksörle kullanma konusunda bir örnek verebilir misiniz?

Elbette. HTML şablonlarını bir dizide tutan ve bu şablonlara erişmek için bir indeksör kullanan bir sınıf oluşturabilirsiniz. Ardından, bu HTML dizelerini PDF belgelerine dönüştürmek için bir PDF kütüphanesi kullanın. Örneğin, PdfGenerator adlı bir sınıf, HTML'ye erişmek ve PDF'ler oluşturmak için bir indeksör kullanır.

C# dilinde indeksör kullanmanın avantajları nelerdir?

C# dilindeki indeksörler, koleksiyon elemanlarına erişmek için basitleştirilmiş bir sözdizimi sağlar, böylece kodunuz daha sezgisel ve okunabilir hale gelir. Sınıf veya yapılar, diziler gibi davranarak verilerin daha verimli bir şekilde kapsüllenmesini ve erişimini sağlar.

İndeksörler, C# dilinde dinamik veri yapıları oluşturmada nasıl yardımcı olabilir?

İndeksörler, geliştiricilere koleksiyonları dizi benzeri bir sözdizimi kullanarak erişim ve düzenleme yapmayı mümkün kılarak dinamik veri yapıları oluşturma imkanı tanır. Bu, özellikle verilerin esnek bir şekilde yönetilmesi gerektiği senaryolarda, örneğin dinamik PDF içerik üretiminde kullanışlı olabilir.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Chief Technology Officer

Jacob Mellor, Iron Software'in Teknoloji Müdürü ve C# PDF teknolojisinin öncüsü olan vizyoner bir mühendis. Iron Software’in temel kod tabanının ilk geliştiricisi olarak, şirketin ürün mimarisini kuruluşundan bu yana şekillendirdi ve CEO Cameron Rimington ile birlikte NASA, Tesla ve ...

Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara