2010-08-07 4 views
3

Je commence en C# et j'ai une question.C# Type de référence de propriété?

Dire que j'ai un objet:

Person 

et une propriété sur la personne appelée Cat:

Person.Cat 

Si je fais:

Cat cat = new Cat(stuff); 
cat.Name = "Alan"; 
Person.Cat = cat; 

Est-Cat une référence directe à chat ? Si je fais:

Person.Cat.Name = "John"; 

Nom de chat sera "John"? Parce que je pense que j'ai essayé de faire quelque chose comme ça avant, et j'ai eu NullReferenceException ou quelque chose comme ça.

+0

Qu'est-ce qui se passe vous l'essayez? – ChaosPandion

+0

Cela n'a rien à voir avec XNA. Vous devriez enlever cette étiquette, si possible. – Rich

+0

Votre 'NullReferenceException' peut avoir eu lieu car votre programme n'a pas encore affecté de valeur à' Person.Cat'. –

Répondre

5

Si 'cat' est une classe, c'est-à-dire un type de référence, une copie de cette référence sera stockée en personne.Cat. Cela signifie que les modifications apportées aux propriétés de «chat» seront reflétées en personne. Cependant, étant donné qu'il est une copie de la référence originale, le comportement est comme ceci:

Cat cat = new Cat(stuff); 
cat.Name = "Alan"; 
Person.Cat = cat; 
cat.Name = "Will"; //Person.Cat.Name is now "Will" 
cat = new Cat(stuff); 
cat.Name = "Greg"; 
// Person.Cat is still named "Will". 
// The original reference now points to a different object on the heap than does Person.Cat. 

si Cat est un type de valeur, une copie est faite sur l'affectation et les changements dans l'un ne reflète pas dans l'autre (bien sûr, une structure pourrait avoir une propriété de type référence ou un champ public, mais vous avez l'idée).

+0

Notez également que les structures sont des types de valeurs, donc pour celles-ci, une copie est faite à la place d'une référence. –

0

Est-ce que Cat est une référence directe à cat?

Oui. Par exemple:

var cat = new Cat(stuff); 
cat.Name = "Alan"; 
Person.Cat = cat; 
cat.Name = "George"; 
var nowCalledGeorge = Person.Cat.Name; 

Donc, la réponse à cette question

Nom de chat sera "John"?

est oui.

1

Ceci est correct, en supposant que votre code complet est quelque chose comme ceci:

// Person class. 
public class Person { 

    // Automatic property. 
    public Cat Cat { get; set; } 

} 

// Cat class (not a struct!). 
public class Cat { 

    // Automatic property. 
    public string Name { get; set; } 

} 

Dans ce cas, l'accès myPerson.Cat vous donnera une référence directe à cet objet. Vous pouvez appeler des méthodes, accéder à ses propriétés, le passer dans une méthode qui accepte un paramètre Cat, comme vous le souhaitez. Toutefois, dans cette situation, vous n'avez aucune certitude que la propriété myPerson.Cat n'est pas null. N'importe quel code peut définir n'importe quel objet de type Cat ou null. Si quelque chose l'a mis à null et que vous essayez d'accéder à myPerson.Cat.Name, vous obtiendrez un NullReferenceException. Afin d'éviter d'obtenir ces exceptions, vous devez toujours vérifier que la propriété n'est pas null à travers un contrôle explicite comme if (myPerson.Cat != null) { ... } avant de l'utiliser.Vous pouvez passer cette étape si vous connaissez pour sûr qu'il ne peut jamais être null, et que rien ne peut violer cette hypothèse. Vous pouvez vouloir utiliser code contracts pour vous assurer que vous serez plus à l'aise lorsque vous serez à l'aise avec la langue.

Questions connexes