Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Petunjuk / Saran
Baru mengembangkan perangkat lunak? Mulai dengan tutorial Memulai terlebih dahulu. Mereka membimbing Anda dalam menulis program dan memperkenalkan tipe data seiring Anda belajar.
Berpengalaman dalam bahasa lain? Jika Anda sudah memahami sistem jenis, lewati perbedaan nilai vs. referensi dan panduan memilih jenis tipe, lalu lanjutkan ke artikel tentang jenis-jenis tertentu.
C# adalah bahasa yang sangat ditik. Setiap variabel, konstanta, dan ekspresi memiliki jenis. Kompilator memberlakukan keamanan jenis dengan memeriksa bahwa setiap operasi dalam kode Anda valid untuk jenis yang terlibat. Misalnya, Anda dapat menambahkan dua int nilai, tetapi Anda tidak dapat menambahkan int dan bool:
int a = 5;
int b = a + 2; // OK
bool test = true;
// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
// int c = a + test;
Nota
Tidak seperti C dan C++, di C#, bool tidak dapat dikonversi ke int.
Keamanan tipe menangkap kesalahan pada saat kompilasi, sebelum kode Anda berjalan. Pengkompilasi juga menyematkan informasi tipe ke dalam executable sebagai metadata, yang digunakan Common Language Runtime (CLR) untuk pemeriksaan keamanan tambahan pada waktu proses.
Mendeklarasikan variabel dengan jenis
Saat Anda mendeklarasikan variabel, Anda menentukan jenisnya secara eksplisit atau menggunakan var untuk membiarkan pengkompilasi menyimpulkan jenis dari nilai yang ditetapkan:
// Explicit type:
int count = 10;
double temperature = 36.6;
// Compiler-inferred type:
var name = "C#";
var items = new List<string> { "one", "two", "three" };
Parameter metode dan nilai pengembalian juga memiliki jenis. Metode berikut mengambil string dan int, dan mengembalikan string:
static string GetGreeting(string name, int visitCount)
{
return visitCount switch
{
1 => $"Welcome, {name}!",
_ => $"Welcome back, {name}! Visit #{visitCount}."
};
}
Setelah mendeklarasikan variabel, Anda tidak dapat mengubah jenisnya atau menetapkan nilai yang tidak kompatibel dengan jenis yang dideklarasikan. Anda dapat mengonversi nilai ke jenis lain. Pengkompilasi melakukan konversi implisit yang tidak kehilangan data secara otomatis. Konversi eksplisit (cast) mengharuskan Anda untuk menunjukkan konversi dalam kode Anda. Untuk informasi selengkapnya, lihat Konversi transmisi dan jenis.
Jenis bawaan dan jenis kustom
C# menyediakan jenis bawaan untuk data umum: bilangan bulat, angka floating-point, bool, char, dan string. Setiap program C# dapat menggunakan jenis bawaan ini tanpa referensi tambahan.
Selain jenis bawaan, Anda dapat membuat jenis Anda sendiri dengan menggunakan beberapa konstruksi:
- Kelas — Jenis referensi untuk perilaku pemodelan dan objek kompleks. Mendukung warisan dan polimorfisme.
- Structs — Jenis nilai untuk data kecil dan ringan. Setiap variabel menyimpan salinannya sendiri.
-
Rekor — Kelas atau struktur dengan kesetaraan yang dihasilkan oleh kompilator,
ToString, dan mutasi yang tidak merusak melalui ekspresiwith. - Antarmuka — Kontrak yang menentukan anggota kelas atau struktur apa pun dapat diterapkan.
- Enumerasi — Seperangkat konstanta integral yang dinamai, seperti hari dalam seminggu atau mode akses file.
- Tuple — Jenis struktural ringan yang mengelompokkan nilai terkait tanpa menentukan jenis bernama.
-
Generik — Konstruksi berparameter jenis seperti
List<T>danDictionary<TKey, TValue>yang memberikan keamanan jenis sambil menggunakan kembali logika yang sama untuk berbagai jenis.
Jenis nilai dan jenis referensi
Setiap jenis dalam C# adalah jenis nilai atau jenis referensi. Perbedaan ini menentukan cara kerja variabel menyimpan data dan cara kerja penugasan.
Jenis nilai menyimpan data mereka secara langsung. Saat Anda menetapkan jenis nilai ke variabel baru, runtime menyalin data. Perubahan pada satu variabel tidak memengaruhi variabel lainnya. Struktur, enum, dan jenis numerik bawaan adalah semua jenis nilai.
Tipe referensi menyimpan referensi ke objek pada tumpukan terkelola. Saat Anda menetapkan jenis referensi ke variabel baru, kedua variabel menunjuk ke objek yang sama. Perubahan melalui satu variabel terlihat melalui variabel lainnya. Kelas, array, delegasi, dan string adalah jenis referensi.
Contoh berikut menunjukkan perbedaannya. Blok pertama menunjukkan definisi untuk Coords struktur rekaman, yang merupakan jenis nilai. Blok kedua menunjukkan perilaku yang berbeda untuk jenis nilai dan jenis referensi.
public readonly record struct Coords(int X, int Y);
// Value type: each variable holds its own copy
var point1 = new Coords(3, 4);
var point2 = point1;
Console.WriteLine($"point1: ({point1.X}, {point1.Y})");
Console.WriteLine($"point2: ({point2.X}, {point2.Y})");
// point1 and point2 are independent copies
// Reference type: both variables refer to the same object
var list1 = new List<int> { 1, 2, 3 };
var list2 = list1;
list2.Add(4);
Console.WriteLine($"list1 count: {list1.Count}"); // 4 — same object
Semua jenis pada akhirnya berasal dari System.Object. Jenis nilai berasal dari System.ValueType, yang berasal dari object. Hierarki terpadu ini disebut Common Type System (CTS). Untuk informasi selengkapnya tentang pewarisan, lihat Warisan.
Pilih jenis jenis mana
Saat Anda menentukan jenis baru, jenis yang Anda pilih membentuk perilaku kode Anda. Gunakan panduan berikut untuk membuat keputusan awal:
- Tuple — Pengelompokan nilai sementara yang tidak memerlukan jenis atau perilaku bernama.
-
structataurecord struct— Data kecil (sekitar 64 byte atau kurang), semantik nilai, atau kekekalan. Rekam struktur menambahkan kesetaraan danwithekspresi berbasis nilai. -
record class— Terutama data, dengan kesetaraan berbasis nilai,ToString, dan mutasi nondestruktif. Mendukung pewarisan. -
class— Perilaku kompleks, polimorfisme, atau keadaan berubah. Sebagian besar tipe kustom adalah kelas. -
interface— Sebuah kontrak yang dapat diterapkan oleh tipe yang tidak berhubungan. Mendefinisikan kemampuan daripada identitas. -
enum— Sekumpulan konstanta bernama tetap, seperti kode status atau opsi.
Lebih dari satu opsi sering kali masuk akal.
Jenis waktu kompilasi dan jenis waktu jalan
Variabel dapat memiliki jenis yang berbeda pada waktu kompilasi dan run time. Jenis waktu kompilasi adalah jenis yang dideklarasikan atau disimpulkan dalam kode sumber. Jenis run-time adalah jenis sebenarnya dari instans yang dirujuk variabel. Jenis run-time harus sama dengan jenis waktu kompilasi, atau jenis yang berasal darinya atau mengimplementasikannya. Penugasan hanya valid ketika konversi implisit ada dari tipe waktu run-time ke tipe waktu kompilasi, seperti identitas, referensi, pengkotakan, atau konversi numerik.
// Compile-time and run-time types match:
string message = "Hello, world!";
// Compile-time type differs from run-time type:
object boxed = "This is a string at run time";
IEnumerable<char> characters = "abcdefghijklmnopqrstuvwxyz";
Dalam contoh sebelumnya, boxed memiliki jenis waktu kompilasi object tetapi jenis waktu run-time string. Penugasan berfungsi karena string berasal dari object. Demikian pula, characters memiliki jenis waktu kompilasi IEnumerable<char>, dan penugasan berfungsi karena string mengimplementasikan antarmuka tersebut. Jenis waktu kompilasi mengontrol resolusi kelebihan beban dan konversi yang tersedia. Jenis run-time mengontrol pengiriman metode virtual, ekspresi is, dan ekspresi switch.
Baca juga
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.