Pemalar dan Medan readonly
Bezakan const daripada static readonly.
Pemalar dan Medan readonly ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 3 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 Cara Menjadikan Nilai Tetap
C# menawarkan const dan readonly untuk nilai yang tidak sepatutnya berubah. Kedua-duanya kelihatan serupa tetapi berkelakuan sangat berbeza. Pelajaran ini membandingkan kedua-duanya.
using System;
class Config
{
public const double Pi = 3.14159;
public static readonly DateTime StartedAt = DateTime.Now;
}
class Program
{
static void Main()
{
Console.WriteLine("Pi = " + Config.Pi);
}
}const: Pemalar Masa Kompil
const mesti diberikan nilai harfiah semasa pengisytiharan dan nilainya disisipkan pada masa kompil. Ia secara tersirat bersifat statik.
using System;
class Circle
{
public const double Pi = 3.14159;
public static double Area(double r) => Pi * r * r;
}
class Program
{
static void Main()
{
Console.WriteLine(Circle.Area(2).ToString("0.00"));
}
}const Mesti Berupa Nilai Harfiah
Oleh sebab nilainya ditentukan pada masa kompil, const hanya boleh menyimpan ungkapan pemalar: nombor, rentetan, nilai benar atau palsu, atau pemalar lain.
using System;
class Limits
{
public const int MaxRetries = 3;
public const int Timeout = MaxRetries * 1000; // const expression OK
}
class Program
{
static void Main()
{
Console.WriteLine(Limits.MaxRetries + ", " + Limits.Timeout);
}
}readonly: Pemalar Masa Jalan
Medan readonly ditetapkan sekali, sama ada semasa pengisytiharan atau dalam pembina, dan kemudiannya tidak boleh diubah. Nilainya boleh dikira pada masa jalan.
using System;
class Session
{
public readonly string Id;
public Session(string id)
{
Id = id; // allowed: inside constructor
}
}
class Program
{
static void Main()
{
var s = new Session("abc-123");
Console.WriteLine("Session: " + s.Id);
}
}readonly Boleh Menggunakan Nilai Masa Jalan
Berbeza daripada const, medan readonly boleh menyimpan nilai yang hanya diketahui apabila program dijalankan, seperti pengenal yang dijana atau waktu semasa.
using System;
class Order
{
public readonly Guid OrderId;
public Order()
{
OrderId = Guid.NewGuid();
}
}
class Program
{
static void Main()
{
var o = new Order();
Console.WriteLine("Has id: " + (o.OrderId != Guid.Empty));
}
}statik readonly
Gabungkan static readonly untuk mendapatkan nilai seluruh kelas yang dikira sekali pada masa jalan. Ini ialah pengganti biasa bagi const apabila nilainya bukan nilai harfiah.
using System;
class AppInfo
{
public static readonly string[] Roles = { "admin", "user", "guest" };
}
class Program
{
static void Main()
{
Console.WriteLine("Roles: " + Roles());
}
static int Roles() => AppInfo.Roles.Length;
}Mengapa Pemalar Boleh Berisiko Merentas Himpunan
Oleh sebab nilai const disisipkan terus ke dalam kod pemanggil pada masa kompilasi, perubahan pada pemalar awam dalam pustaka memerlukan semua pemanggil dikompil semula. static readonly mengelakkan perkara ini.
using System;
class Lib
{
public const int Version = 2; // inlined into callers
public static readonly int Build = 100; // read at runtime
}
class Program
{
static void Main()
{
Console.WriteLine(Lib.Version + "." + Lib.Build);
}
}Kedua-duanya Tidak Boleh Ditetapkan Semula
Selepas pemulaan, medan const dan readonly tidak boleh diubah. Percubaan untuk berbuat demikian menghasilkan ralat kompilasi.
using System;
class Demo
{
public const int A = 10;
public readonly int B;
public Demo() { B = 20; }
// A = 11; // would not compile
// B = 21; // would not compile outside constructor
}
class Program
{
static void Main()
{
var d = new Demo();
Console.WriteLine(Demo.A + ", " + d.B);
}
}Memilih antara Kedua-duanya
Gunakan const untuk literal sebenar yang tidak pernah berubah (Pi, MaxInt). Gunakan readonly apabila nilai dikira pada masa jalan atau mungkin berbeza mengikut instans.
using System;
class Physics
{
public const double Gravity = 9.81; // universal literal
public readonly double Mass; // per object
public Physics(double mass) { Mass = mass; }
public double Weight() => Mass * Gravity;
}
class Program
{
static void Main()
{
var p = new Physics(10);
Console.WriteLine("Weight: " + p.Weight());
}
}Peringatan tentang Rujukan Baca Sahaja
readonly mengunci medan, bukan objek yang dirujuknya. Rujukan senarai baca sahaja tidak boleh ditetapkan semula, tetapi kandungannya masih boleh berubah.
using System;
using System.Collections.Generic;
class Cart
{
public readonly List<string> Items = new List<string>();
}
class Program
{
static void Main()
{
var c = new Cart();
c.Items.Add("Pen"); // allowed: mutating the object
c.Items.Add("Book");
Console.WriteLine("Items: " + c.Items.Count);
}
}Menggabungkannya
Kelas biasa menggunakan const untuk literal tetap dan readonly untuk nilai yang ditetapkan bagi setiap instans semasa pembinaan.
using System;
class Account
{
public const decimal MinBalance = 0m;
public readonly string Owner;
public Account(string owner)
{
Owner = owner;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " min=" + Account.MinBalance);
}
}Semakan Pantas
Uji pemahaman anda tentang pemalar berbanding medan baca sahaja.
Ulang Kaji
const ialah literal masa kompilasi, secara tersirat bersifat statik, dan disisipkan terus ke dalam pemanggil. readonly ditetapkan sekali semasa pengisytiharan atau dalam pembina dan boleh menggunakan nilai masa jalan. Gunakan const untuk literal sebenar, static readonly untuk nilai dikongsi yang dikira pada masa jalan, dan ingat bahawa medan baca sahaja mengunci rujukan, bukan objek.
using System;
class Demo
{
public const int Max = 100;
public readonly int Created;
public Demo(int c) { Created = c; }
}
class Program
{
static void Main()
{
var d = new Demo(7);
Console.WriteLine(Demo.Max + ", " + d.Created);
}
}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 “Pemalar dan Medan readonly” percuma?
Ya — teks penuh “Pemalar dan Medan readonly” 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 “Pemalar dan Medan readonly”?
Bezakan const daripada static readonly. 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 3 daripada 4.
Berapa lamakah pelajaran “Pemalar dan Medan readonly” 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
- Kaedah dan Medan Statik
- Kelas Statik untuk Utiliti
- Pemalar dan Medan readonly
- Reka Bentuk Statik berbanding Tika