Salah satu ralat yang paling biasa dan mengecewakan yang dihadapi oleh pembangun C# ialah rujukan Objek terkenal yang tidak ditetapkan kepada tika objek. Mesej ralat ini boleh mengelirukan, terutamanya bagi mereka yang baru dalam pengaturcaraan. Dalam artikel ini, kami akan menjelaskan ralat ini, menerangkan puncanya, memberikan analogi kehidupan sebenar yang tidak dapat dilupakan dan menawarkan penyelesaian untuk mencegah dan membetulkannya.
Apakah Maksud "Rujukan Objek Tidak Ditetapkan kepada Contoh Objek"?
Dalam istilah orang awam, ralat ini berlaku apabila anda cuba menggunakan objek yang belum dibuat lagi. Ia seperti cuba memandu kereta yang belum dibina—anda tidak boleh menggunakan sesuatu yang tidak wujud.
Dari segi teknikal, ralat ini ialah NullReferenceException. Ia berlaku apabila anda cuba mengakses ahli (kaedah, harta, medan) objek yang batal. Objek nol bermakna rujukan objek menunjuk kepada tiada atau tiada contoh objek wujud dalam ingatan.
Analogi Kehidupan Sebenar
Bayangkan anda berada di rumah, dan anda ingin membuat panggilan telefon. Anda mencapai telefon anda, tetapi telefon itu tiada kerana anda tidak pernah membelinya. Dalam senario ini:
Telefon ialah objeknya.
Mencapai telefon adalah seperti cuba mengakses ahli objek.
Tiada telefon adalah seperti rujukan objek menjadi batal.
Jadi, apabila anda cuba membuat panggilan, anda tidak boleh, kerana telefon (objek) tidak wujud. Begitu juga, dalam kod anda, cubaan menggunakan objek yang belum diinstakan menyebabkan rujukan Objek tidak ditetapkan kepada kejadian ralat objek.
Senario dan Pembetulan Biasa:
- Objek Tidak Dimulakan
class Person { public string Name { get; set; } } Person person = null; Console.WriteLine(person.Name); // Throws NullReferenceException
Betulkan: Mulakan Objek
Person person = new Person(); person.Name = "John"; Console.WriteLine(person.Name); // No error
- Ahli Tidak Dimulakan dalam Kelas
class Car { public Engine Engine { get; set; } } class Engine { public int Horsepower { get; set; } } Car car = new Car(); Console.WriteLine(car.Engine.Horsepower); // Throws NullReferenceException
Betulkan: Mulakan Ahli
Car car = new Car { Engine = new Engine() }; car.Engine.Horsepower = 150; Console.WriteLine(car.Engine.Horsepower); // No error
- Nol Pulangan daripada Kaedah
class Repository { public Person GetPersonById(int id) { // Returns null if person not found return null; } } Repository repo = new Repository(); Person person = repo.GetPersonById(1); Console.WriteLine(person.Name); // Throws NullReferenceException
Betulkan: Semak Nol
Person person = repo.GetPersonById(1); if (person != null) { Console.WriteLine(person.Name); // No error if person is not null } else { Console.WriteLine("Person not found"); }
- Andaian Salah tentang Koleksi
List<Person> people = null; Console.WriteLine(people.Count); // Throws NullReferenceException
Betulkan: Mulakan Koleksi
List<Person> people = new List<Person>(); Console.WriteLine(people.Count); // No error
Amalan Terbaik untuk Mengelakkan NullReferenceExceptions
Pengendali bersyarat nol (?.) boleh membantu mengakses ahli objek yang mungkin nol dengan selamat.
Person person = null; Console.WriteLine(person?.Name); // No error, outputs nothing
Sentiasa mulakan pembolehubah dan ahli kelas anda untuk mengelakkan rujukan nol.
class Car { public Engine Engine { get; set; } = new Engine(); }
Sentiasa semak nol sebelum mengakses ahli objek.
if (person != null) { Console.WriteLine(person.Name); }
Apabila menggunakan LINQ, pastikan koleksi tidak batal sebelum melakukan pertanyaan.
var names = people?.Select(p => p.Name).ToList();
Kesimpulan
Rujukan Objek yang tidak ditetapkan kepada contoh ralat objek ialah batu penghalang biasa untuk pembangun C#, tetapi memahami puncanya dan mengetahui cara mencegah dan membetulkannya boleh menjimatkan banyak sakit kepala. Sentiasa ingat untuk memulakan objek anda dan lakukan semakan nol jika perlu. Dengan mengambil kira amalan terbaik ini, anda akan dilengkapi dengan baik untuk mengendalikan dan mengelakkan ralat ini dalam projek masa hadapan anda.
Akaun LinkedIn : LinkedIn
Akaun Twitter: Twitter
Kredit: Grafik bersumberkan Log MasukRadius
Atas ialah kandungan terperinci Memahami dan Membetulkan \'Rujukan Objek Tidak Ditetapkan kepada Contoh Objek\' dalam C#. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!