Jenis Nilai berbanding Jenis Rujukan
Lihat cara setiap jenis disimpan dan disalin.
Jenis Nilai berbanding Jenis Rujukan ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Dua Keluarga Jenis
Jenis C# terbahagi kepada jenis nilai (int, double, nilai benar atau palsu, struktur) dan jenis rujukan (kelas, rentetan, tatasusunan). Jenis ini berbeza dari segi cara penyimpanan dan penyalinannya.
using System;
class Program
{
static void Main()
{
int valueType = 5; // value type
int[] referenceType = { 1, 2, 3 }; // reference type
Console.WriteLine(valueType + ", length " + referenceType.Length);
}
}Jenis Nilai Menyimpan Data
Pemboleh ubah jenis nilai mengandungi datanya secara terus. Biasanya, data ini berada pada tindanan atau disimpan sebaris dalam objek yang mengandunginya.
using System;
class Program
{
static void Main()
{
int a = 10;
double b = 3.14;
bool c = true;
Console.WriteLine(a + ", " + b + ", " + c);
}
}Jenis Rujukan Menyimpan Alamat
Pemboleh ubah jenis rujukan menyimpan reference (alamat) kepada data yang disimpan pada longgokan. Pemboleh ubah dan objek itu berasingan.
using System;
class Box { public int Value; }
class Program
{
static void Main()
{
Box b = new Box(); // b refers to a heap object
b.Value = 42;
Console.WriteLine(b.Value);
}
}Semantik Salinan: Jenis Nilai
Menugaskan jenis nilai akan menyalin data. Perubahan pada copy tidak akan mengubah original.
using System;
class Program
{
static void Main()
{
int a = 1;
int b = a; // copy
b = 99;
Console.WriteLine("a=" + a + ", b=" + b);
}
}Semantik Salinan: Jenis Rujukan
Apabila jenis rujukan ditetapkan, yang disalin ialah rujukan, bukan objek. Kedua-dua pemboleh ubah kemudian menunjuk kepada objek yang sama.
using System;
class Box { public int Value; }
class Program
{
static void Main()
{
Box a = new Box { Value = 1 };
Box b = a; // same object
b.Value = 99;
Console.WriteLine("a.Value=" + a.Value + ", b.Value=" + b.Value);
}
}Struktur ialah Jenis Nilai
struct yang anda takrifkan ialah jenis nilai, jadi ia disalin apabila ditetapkan sama seperti int.
using System;
struct Point { public int X, Y; }
class Program
{
static void Main()
{
Point p1 = new Point { X = 1, Y = 2 };
Point p2 = p1; // full copy
p2.X = 99;
Console.WriteLine("p1.X=" + p1.X + ", p2.X=" + p2.X);
}
}Memberikan kepada Kaedah
Secara lalai, jenis nilai diberikan melalui salinan, manakala jenis rujukan memberikan salinan rujukan. Oleh itu, kaedah boleh mengubah objek kelas yang dapat dilihat oleh pemanggil, tetapi tidak boleh mengubah nilai int biasa.
using System;
class Counter { public int N; }
class Program
{
static void BumpInt(int x) { x++; }
static void BumpObj(Counter c) { c.N++; }
static void Main()
{
int i = 0;
BumpInt(i);
var c = new Counter();
BumpObj(c);
Console.WriteLine("i=" + i + ", c.N=" + c.N);
}
}Nilai Kosong dan Jenis Rujukan
Hanya jenis rujukan boleh mempunyai nilai null (ketiadaan objek). Jenis nilai sentiasa menyimpan suatu nilai melainkan diisytiharkan boleh menerima nilai kosong dengan ?.
using System;
class Program
{
static void Main()
{
string text = null; // reference type can be null
int? maybe = null; // nullable value type
Console.WriteLine((text == null) + ", " + (maybe == null));
}
}Perbezaan Kesamaan
Bagi jenis nilai, == membandingkan data. Bagi jenis rujukan, == biasanya membandingkan identiti (objek yang sama), melainkan tingkah laku itu ditindih.
using System;
class Program
{
static void Main()
{
int a = 5, b = 5;
Console.WriteLine("ints: " + (a == b)); // True - same value
object o1 = new object();
object o2 = new object();
Console.WriteLine("objects: " + (o1 == o2)); // False - different identity
}
}Nilai Lalai
Jenis nilai mempunyai nilai lalai yang menyerupai sifar (0, palsu); jenis rujukan secara lalai mempunyai nilai null.
using System;
class Program
{
static void Main()
{
int defaultInt = default;
bool defaultBool = default;
string defaultString = default;
Console.WriteLine(defaultInt + ", " + defaultBool + ", null? " + (defaultString == null));
}
}Menggabungkan Semuanya
Dengan mengetahui sama ada sesuatu jenis ialah jenis nilai atau jenis rujukan, anda boleh menjangka tingkah laku penyalinan, kebolehnilainya dan cara kaedah boleh mengubahnya. Pengetahuan ini membantu anda menghasilkan kod yang betul dan bebas pepijat.
using System;
struct Money { public decimal Amount; }
class Wallet { public decimal Amount; }
class Program
{
static void Main()
{
Money m1 = new Money { Amount = 10 };
Money m2 = m1; m2.Amount = 99;
Wallet w1 = new Wallet { Amount = 10 };
Wallet w2 = w1; w2.Amount = 99;
Console.WriteLine("Money copy: " + m1.Amount + " (independent)");
Console.WriteLine("Wallet ref: " + w1.Amount + " (shared)");
}
}Semakan Pantas
Uji pemahaman anda tentang jenis nilai dan jenis rujukan.
Ringkasan
Jenis nilai (int, nombor titik apung, boolean, struktur) menyimpan data secara langsung dan disalin apabila ditetapkan; jenis rujukan (kelas, rentetan, tatasusunan) menyimpan rujukan kepada objek pada timbunan dan menyalin rujukan itu. Hanya jenis rujukan yang secara lalai boleh menerima nilai kosong, dan tingkah laku penetapan serta kesamaan berbeza antara kedua-dua keluarga ini.
using System;
struct V { public int N; }
class R { public int N; }
class Program
{
static void Main()
{
V v1 = new V { N = 1 }; V v2 = v1; v2.N = 9;
R r1 = new R { N = 1 }; R r2 = r1; r2.N = 9;
Console.WriteLine(v1.N + " vs " + r1.N);
}
}Pelajari C# dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Soalan Lazim
Adakah pelajaran “Jenis Nilai berbanding Jenis Rujukan” percuma?
Ya — teks penuh “Jenis Nilai berbanding Jenis Rujukan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Jenis Nilai berbanding Jenis Rujukan”?
Lihat cara setiap jenis disimpan dan disalin. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Jenis Nilai berbanding Jenis Rujukan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?
Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Jenis Nilai berbanding Jenis Rujukan
- Pembungkusan dan Penyahbungkus
- Penukaran Implisit dan Eksplisit
- Kelas Convert dan Penghuraian