2017-01-28 1 views
0

Excuses pour ce qui est probablement une question stupide, mais je pense que j'ai fait bouillir mon code sur les questions de base, dont il y a deux qui me poussent des noisettes. J'apprécierais toute aide.Portée/Accessibilité & Référence d'objet non définie à une instance d'un objet

Dans le code ci-dessous, le premier problème est lorsque mon débogage arrive à la ligne 'bus [0] ..' Je reçois la 'Référence d'objet non définie sur une instance d'un objet', même si je viens d'instancier le classe dans la ligne précédente.

Mon prochain problème est que la classe 'SystemArrays' est destinée à être un référentiel, visible par toutes mes classes (comme 'Solver'), où ils peuvent Get & Définir ses propriétés publiques. Cependant, je ne peux pas comprendre comment ou où instancier la classe pour la rendre visible à tout le monde.

Toute aide serait grandement appréciée. Merci.

public Form1() 
    { 
     InitializeComponent(); 
    } 

    SystemArrays newArray = new SystemArrays(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Bus[] bus = new Bus[3]; 
     bus[0].elementNum = 5; 
     bus[1].elementNum = 8; 
     bus[2].elementNum = 26; 

     newArray.buses[0].elementNum = bus[0].elementNum; 
    } 

    public class SystemArrays 
    { 
     public Bus[] buses { get; set; } 
    } 

    public class Bus 
    { 
     public int elementNum { get; set; } 
    } 

    public class Solver 
    { 
     // int x = newArray.buses[0].elementNum; 
    } 
+0

Malheureusement message contient 2 questions sans rapport - principal est ainsi fermé en double, répondre à la seconde peut être trouvé en utilisant la recherche https://www.bing.com/search ? q = c% 23% 20property% 20accessible% 20to% 20all% 20classes et fermé comme doublon de http://stackoverflow.com/questions/7679230/how-to-make-a-object-accessible-through-all-files -in-c-sharp par exemple. –

Répondre

2

1. Vous êtes l'initialisation du tableau, ne pas initialiser les objets à l'intérieur du tableau et obtenir ainsi la référence d'objet non définie sur une instance d'un objet exception. , Vous avez besoin de faire un changement de code comme

Bus[] bus = new Bus[3]; 
bus[0].elementNum = 5; 

Pour

Bus[] bus = new Bus[3]; 
bus[0] = new Bus(); 
bus[0].elementNum = 5; 

2. Pour newArray publique, définissez l'accessibilité droit en spécifiant le niveau de protection approprié comme public que vous devez exposer la classe à d'autres classes. En outre, vous pouvez le déclarer statique si vous avez besoin d'une copie unique de newArray, bien qu'il soit préférable de créer une propriété get pour ce type de scénario.

public static SystemArrays newArray = new SystemArrays(); 
+0

Wow, les gars merci. C'est vraiment embarrassant. Je continue à faire la même erreur encore et encore et encore. Encore une fois, mes apoligies pour la question stupide –

+0

Ce qui est embarrassant que cette réponse est même postée - question contient 2 questions sans rapport et le premier est clairement expliqué en double bien connu. –

1

Vous obtenez l'exception 'Référence de l'objet non définie sur une instance d'un objet' car c'est exactement ce qui se passe. Vous avez créé le tableau de 5 éléments (bus), mais vous ne les avez pas initialisés. Après avoir créé un tableau, tous ses éléments contiennent la valeur par défaut du type du tableau. Dans votre type de cas du tableau est Bus (type de référence) et la valeur par défaut de tous les types de référence est null

Vous pouvez initialiser les valeurs de votre tableau en affectant simplement:

bus[0] = new Bus(); 
1

Le problème est que vous instanciez le tableau, mais pas les instances uniques. Vous pouvez utiliser la manière compacte suivante:

var buses = new Bus[3] // instantiate an array object of size 3 
{ 
    new Bus() { elementNum = 5 }, // instantiate new Bus object 
    new Bus() { element = 8 }, // and here 
    new Bus() { elementNum = 26 } // and here 
};