Maison > développement back-end > C++ > le corps du texte

Comprendre et corriger la « référence d'objet non définie sur une instance d'un objet » en C#

王林
Libérer: 2024-07-19 01:15:19
original
536 Les gens l'ont consulté

Understanding and Fixing

Introduction

L'une des erreurs les plus courantes et les plus frustrantes rencontrées par les développeurs C# est la fameuse référence d'objet non définie sur une instance d'un objet. Ce message d'erreur peut prêter à confusion, en particulier pour ceux qui débutent en programmation. Dans cet article, nous démystifierons cette erreur, expliquerons ses causes, fournirons une analogie mémorable avec la vie réelle et proposerons des solutions pour la prévenir et la corriger.

Que signifie « Référence d'objet non définie sur une instance d'un objet » ?
En termes simples, cette erreur se produit lorsque vous essayez d'utiliser un objet qui n'a pas encore été créé. C'est comme essayer de conduire une voiture qui n'a pas été construite : vous ne pouvez pas utiliser quelque chose qui n'existe pas.

En termes techniques, cette erreur est une NullReferenceException. Cela se produit lorsque vous tentez d'accéder à un membre (méthode, propriété, champ) d'un objet nul. Un objet nul signifie que la référence de l'objet ne pointe vers rien ou qu'aucune instance de l'objet n'existe en mémoire.

Analogie réelle
Imaginez que vous êtes chez vous et que vous souhaitez passer un appel téléphonique. Vous prenez votre téléphone, mais il n’est pas là parce que vous n’en avez jamais acheté. Dans ce scénario :

  • Le téléphone est l'objet.

  • Atteindre le téléphone, c'est comme essayer d'accéder à un membre de l'objet.

  • Ne pas avoir le téléphone, c'est comme si la référence de l'objet était nulle.

Donc, lorsque vous essayez de passer un appel, vous ne pouvez pas, car le téléphone (objet) n'existe pas. De même, dans votre code, si vous essayez d'utiliser un objet qui n'a pas été instancié, la référence d'objet n'est pas définie sur une instance d'erreur d'objet.

Scénarios et correctifs courants :

- Objets non initialisés

class Person
{
    public string Name { get; set; }
}

Person person = null;
Console.WriteLine(person.Name); // Throws NullReferenceException

Copier après la connexion

Correction : initialiser l'objet

Person person = new Person();
person.Name = "John";
Console.WriteLine(person.Name); // No error

Copier après la connexion

- Membres non initialisés dans une classe

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

Copier après la connexion

Correction : initialiser le membre

Car car = new Car { Engine = new Engine() };
car.Engine.Horsepower = 150;
Console.WriteLine(car.Engine.Horsepower); // No error

Copier après la connexion

- Retour nul des méthodes

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

Copier après la connexion

Correction : vérifier la valeur 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");
}

Copier après la connexion

- Hypothèses incorrectes sur les collections

List<Person> people = null;
Console.WriteLine(people.Count); // Throws NullReferenceException

Copier après la connexion

Correction : initialiser les collections

List<Person> people = new List<Person>();
Console.WriteLine(people.Count); // No error

Copier après la connexion

Meilleures pratiques pour éviter les exceptions NullReferenceExceptions

  1. Utiliser des opérateurs conditionnels nuls

L'opérateur conditionnel nul (?.) peut aider à accéder en toute sécurité aux membres d'un objet qui pourrait être nul.

Person person = null;
Console.WriteLine(person?.Name); // No error, outputs nothing

Copier après la connexion
  1. Initialiser les variables et les membres

Initiez toujours vos variables et membres de classe pour éviter les références nulles.

class Car
{
    public Engine Engine { get; set; } = new Engine();
}

Copier après la connexion
  1. Effectuer des vérifications nulles

Vérifiez toujours la valeur null avant d'accéder aux membres d'un objet.

if (person != null)
{
    Console.WriteLine(person.Name);
}

Copier après la connexion
  1. Utilisez une navigation sécurisée avec LINQ

Lorsque vous utilisez LINQ, assurez-vous que les collections ne sont pas nulles avant d'effectuer des requêtes.

var names = people?.Select(p => p.Name).ToList();

Copier après la connexion

Conclusion
La référence d'objet non définie sur une instance d'erreur d'objet est une pierre d'achoppement courante pour les développeurs C#, mais comprendre sa cause et savoir comment la prévenir et la corriger peut vous éviter bien des maux de tête. N'oubliez pas d'initialiser vos objets et d'effectuer des vérifications nulles si nécessaire. Avec ces bonnes pratiques à l'esprit, vous serez bien équipé pour gérer et éviter cette erreur dans vos futurs projets.

Compte LinkedIn : LinkedIn
Compte Twitter : Twitter
Crédit : Graphiques provenant de LoginRadius

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!