C# 開発者が遭遇する最も一般的でイライラするエラーの 1 つは、オブジェクトのインスタンスに設定されていない悪名高いオブジェクト参照です。このエラー メッセージは、特にプログラミングの初心者にとって混乱を招く可能性があります。この記事では、このエラーをわかりやすく説明し、その原因を説明し、記憶に残る現実の例えを提供し、それを防止および修正するための解決策を提供します。
「オブジェクト参照がオブジェクトのインスタンスに設定されていません」とはどういう意味ですか?
平たく言えば、このエラーは、まだ作成されていないオブジェクトを使用しようとすると発生します。それは、製造されていない車を運転しようとするようなものです。存在しないものを使用することはできません。
技術的に言えば、このエラーは NullReferenceException です。これは、null のオブジェクトのメンバー (メソッド、プロパティ、フィールド) にアクセスしようとすると発生します。 null オブジェクトは、オブジェクト参照が何も指していないか、メモリ内にオブジェクトのインスタンスが存在しないことを意味します。
現実のたとえ
あなたが家にいて、電話をかけたいと思っていると想像してください。携帯電話に手を伸ばしても、携帯電話を購入したことがないため、そこにはありません。このシナリオでは:
電話がオブジェクトです。
電話に手を伸ばすことは、オブジェクトのメンバーにアクセスしようとすることに似ています。
電話を持っていないことは、オブジェクト参照が null であるようなものです。
つまり、電話をかけようとしても、電話(オブジェクト)が存在しないため、電話をかけることができません。同様に、コード内でインスタンス化されていないオブジェクトを使用しようとすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。
一般的なシナリオと修正:
- 初期化されていないオブジェクト
class Person { public string Name { get; set; } } Person person = null; Console.WriteLine(person.Name); // Throws NullReferenceException
修正: オブジェクトを初期化します
Person person = new Person(); person.Name = "John"; Console.WriteLine(person.Name); // No error
- クラス内の初期化されていないメンバー
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
修正: メンバーの初期化
Car car = new Car { Engine = new Engine() }; car.Engine.Horsepower = 150; Console.WriteLine(car.Engine.Horsepower); // No error
- メソッドからの null 戻り値
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
修正: Null をチェック
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"); }
- コレクションに関する誤った仮定
List<Person> people = null; Console.WriteLine(people.Count); // Throws NullReferenceException
修正: コレクションの初期化
List<Person> people = new List<Person>(); Console.WriteLine(people.Count); // No error
NullReferenceExceptions を回避するためのベスト プラクティス
null 条件演算子 (?.) は、null である可能性のあるオブジェクトのメンバーに安全にアクセスするのに役立ちます。
Person person = null; Console.WriteLine(person?.Name); // No error, outputs nothing
null 参照を避けるために、変数とクラス メンバーを常に初期化してください。
class Car { public Engine Engine { get; set; } = new Engine(); }
オブジェクトのメンバーにアクセスする前に、必ず null をチェックしてください。
if (person != null) { Console.WriteLine(person.Name); }
LINQ を使用する場合は、クエリを実行する前にコレクションが null でないことを確認してください。
var names = people?.Select(p => p.Name).ToList();
結論
オブジェクト参照がオブジェクトのインスタンスに設定されていないというエラーは、C# 開発者にとってよくある障害ですが、その原因を理解し、それを防止および修正する方法を知っていれば、多くの悩みを軽減できます。オブジェクトを初期化し、必要に応じて null チェックを実行することを常に忘れないでください。これらのベスト プラクティスを念頭に置くと、今後のプロジェクトでこのエラーを処理し、回避する準備が整います。
LinkedIn アカウント: LinkedIn
Twitterアカウント: Twitter
クレジット: グラフィックの出所は LoginRadius
以上がC# の「オブジェクト参照がオブジェクトのインスタンスに設定されていない」の理解と修正の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。