Tipe Kustom yang Mendukung Range
Tambahkan dukungan Index dan Range ke tipe Anda.
Tipe Kustom yang Mendukung Range adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Dua Cara Mendukung Index dan Range
Tipe buatan Anda sendiri dapat memilih untuk mendukung sintaks Index dan Range. Ada dua cara: menyediakan pengindeks eksplisit, atau menyediakan properti Length/Count serta metode Slice.
Pengindeks Index Eksplisit
Tambahkan pengindeks yang menerima System.Index, dan operator ^ akan langsung berfungsi pada tipe Anda.
using System;
class Deck {
private int[] cards = { 1, 2, 3, 4, 5 };
public int this[Index i] => cards[i];
}
var d = new Deck();
Console.WriteLine(d[^1]); // 5Pengindeks Range Eksplisit
Untuk mendukung pengirisan dengan .., tambahkan pengindeks yang menerima System.Range dan mengembalikan tipe irisan yang Anda inginkan.
using System;
class Deck {
private int[] cards = { 1, 2, 3, 4, 5 };
public int[] this[Range r] => cards[r];
}
var d = new Deck();
Console.WriteLine(string.Join(",", d[1..3])); // 2,3Pola Length + Slice
Kompilator juga dapat membuat dukungan rentang secara otomatis jika tipe Anda memiliki properti Count atau Length dan metode Slice(int start, int length).
Menerapkan Pola
Di sini, penyangga kustom menyediakan Length dan Slice. Kompilator menulis ulang buf[1..3] menjadi buf.Slice(1, 2) untuk Anda.
using System;
class Buffer {
private int[] data = { 10, 20, 30, 40 };
public int Length => data.Length;
public int this[int i] => data[i];
public int[] Slice(int start, int length) {
var result = new int[length];
Array.Copy(data, start, result, 0, length);
return result;
}
}
var buf = new Buffer();
Console.WriteLine(string.Join(",", buf[1..3])); // 20,30Mengapa Length Penting
Properti Length (atau Count) memungkinkan kompilator menentukan indeks dari akhir seperti ^1 pada tipe Anda. Tanpa properti tersebut, ^ tidak dapat diterjemahkan.
using System;
class Buffer {
private int[] data = { 10, 20, 30, 40 };
public int Length => data.Length;
public int this[Index i] => data[i.GetOffset(Length)];
}
var buf = new Buffer();
Console.WriteLine(buf[^1]); // 40Menentukan Index secara Manual
Di dalam pengindeks Index, panggil i.GetOffset(Length) untuk mengubah indeks yang mungkin berasal dari akhir menjadi ofset biasa.
using System;
class Ring {
private string[] items = { "a", "b", "c" };
public int Length => items.Length;
public string this[Index i] {
get {
int offset = i.GetOffset(Length);
return items[offset];
}
}
}
var r = new Ring();
Console.WriteLine(r[^2]); // bMenentukan Range secara Manual
Untuk pengindeks Range, r.GetOffsetAndLength(Length) memberi Anda posisi awal dan jumlah elemen yang akan disalin.
using System;
class Ring {
private int[] items = { 1, 2, 3, 4, 5 };
public int Length => items.Length;
public int[] this[Range r] {
get {
var (start, len) = r.GetOffsetAndLength(Length);
var slice = new int[len];
Array.Copy(items, start, slice, 0, len);
return slice;
}
}
}
var r = new Ring();
Console.WriteLine(string.Join(",", r[^3..^1])); // 3,4Count vs Length
Pola ini menerima salah satu nama tersebut: larik dan span menggunakan Length; List<T> menggunakan Count. Salah satu properti tersebut memenuhi persyaratan kompilator.
using System;
using System.Collections.Generic;
var list = new List<int> { 1, 2, 3, 4 };
// List<T> has Count, so Index works:
Console.WriteLine(list[^1]); // 4Merancang Tipe Pengembalian Slice
Tentukan apakah Slice Anda mengembalikan salinan (seperti larik) atau tampilan (seperti span). Tampilan lebih hemat, tetapi berbagi keadaan yang dapat diubah, jadi dokumentasikan pilihan tersebut.
Tipe Kustom Lengkap
Sequence ini mendukung ^ dan .. melalui pengindeks eksplisit serta properti Length.
using System;
class Sequence {
private int[] data;
public Sequence(int[] d) => data = d;
public int Length => data.Length;
public int this[Index i] => data[i];
public int[] this[Range r] => data[r];
}
var s = new Sequence(new[] { 5, 10, 15, 20 });
Console.WriteLine(s[^1]); // 20
Console.WriteLine(string.Join(",", s[1..^1])); // 10,15Pemeriksaan Singkat
Pastikan Anda memahami hal yang memungkinkan sintaks rentang digunakan pada tipe kustom.
Ringkasan
Anda telah mempelajari dua cara untuk menambahkan dukungan Index/Range ke tipe Anda.
- Pengindeks eksplisit yang menerima
IndexdanRange. - Pola implisit: properti
Count/LengthditambahSlice(int, int). GetOffset(Length)danGetOffsetAndLength(Length)menentukan posisi dari akhir.
Belajar C# dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Tipe Kustom yang Mendukung Range” gratis?
Ya — teks lengkap “Tipe Kustom yang Mendukung Range” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Tipe Kustom yang Mendukung Range”?
Tambahkan dukungan Index dan Range ke tipe Anda. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Tipe Kustom yang Mendukung Range” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Tipe Index dan Operator ^
- Tipe Range dan Operator ..
- Range dengan Array dan String
- Tipe Kustom yang Mendukung Range