2016-03-24 2 views
-3
class Program 

{ 
    class Chair 
    { 
     public Array[] people { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var chr = new Chair(); 
     if(chr.people.Length > 0) Console.WriteLine("got eeem"); 
} 

Я пытался сделать это так же:консоли - Объект не инстанс

class Program 

{ 

    Chair chr { get; set; } 

    class Chair 
    { 
     public Array[] people { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var pr = new Program(); 
     if(pr.chr.people.Length > 0) Console.WriteLine("got eeem"); 
} 

я получаю ту же ошибку:

Object reference not set to an instance of an object.

При проверке, если длина больше чем 0 (В конце концов я буду добавлять к нему).

Почему я не могу проверить его больше 0? Я повторяю это двумя способами и не работаю?

Заранее благодарен!

+2

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix- it) –

+0

Где именно вы его создаете? – Transcendental

+0

Вам нужно создать экземпляр массива людей. И сделайте это внутри своего конструктора. для председателя. Кроме того, сделайте массив людей частным и получите доступ к нему через свойство или метод. – ManoDestra

ответ

1

chr.people - null (не определено). Вам нужно будет назначить его или предоставить стандартный (пустой) массив в ctor стула.

class Chair 
{ 
    public Array[] people { get; set; } 

    public Chair() 
    { 
     people = new Array[0]; // instantiate here 
    } 
} 

Теперь, когда вы создаете новый Chair вы будете иметь пустой массив (который вы можете получить доступ к Length свойству).

В качестве альтернативы вы можете назначить его, когда экземпляр chr:

Chair chr = new Chair(); 
chr.people = new Array[0]; 
// now you can access chr.people.Length 

Ключ Вынос здесь значение по умолчанию (если явно не определено) для массива (в данном случае Array[]) является нулевым, так для доступа нет .Length. Вы можете либо предвидеть это (сначала проверить на .people != null), либо инициализировать его при создании объекта.

+0

О, это имеет больше смысла! Цените это так! будет отмечать ответ, когда возможно – KDOT

+0

решил мою проблему, а также изменил ее на «Список » для удобства и должен был быть экземпляр, который также был оценен! теперь все работает: D – KDOT

1

ваш народ массив пустой

Instantiate его в конструкторе для стула

class Chair 
{ 
    public Chair() 
    { 
     people = new Array[0]; 
    } 

    public Array[] people { get; set; } 
} 

или проверить нуль перед проверкой длины.

if(chr.people != null && chr.people.Length > 0) Console.WriteLine("got eeem"); 

или если вы используете последний:

if (chr.people?.Length > 0) Console.WriteLine("got eeem"); 
+0

проголосовали за помощь! спасибо – KDOT

2

Вы должны нового до вашего chr.people массива также. Предпочтительно в конструкторе стульев

+0

Хотя ваш ответ в значительной степени правилен, лучше было бы воспользоваться, если бы он предоставил код с запросом и добавил предмет, о котором вы говорите. – MattD

+1

проголосовали за краткую идею спасибо! – KDOT

1

Проблема в том, что свойство "people" не инициализируется. У вас есть несколько подходов.

if (chr.people !=null && chr.people.Length > 0) Console.WriteLine("got eeem"); 

Или убедитесь, что люди инициализируются

public class Chair 
    { 
     public Chair() 
     { 
      people = new Array[0]; 
     } 

     public Array[] people { get; set; } 
    } 

Первым является типичным оборонительным кодированием. например, что происходит, если кто-то делает chr.people=null;

Проблема в том, что вы не инкапсулируете проблемы председателя в классе. Это означает, что все, что использует кафедру, должно знать об ограничениях. Класс председателя должен быть разработан таким образом, чтобы он обеспечивал безопасный интерфейс и защищал его ресурсы (то есть собственность людей).

Возможно, что-то вроде этого:

public class Chair 
    { 
     private List<Person> people = new List<Person>(); 
     public IEnumerable<Person> People { get { return people; } } 

     public void AddPerson(Person person) 
     { 
      people.Add(person); 
     } 
     public void RemovePerson(Person person) 
     { 
      people.Remove(person); 
     } 
     public void ClearPeople(Person person) 
     { 
      people.Clear(); 
     } 
    } 
    public class Person 
    { 
     public string Name { get; set; } 
    } 

IEnumerable позволяет только такие вещи, как «Еогеасп», так что никто не может связываться с содержимым коллекции, если они используют Добавить/Удалить/Очистить методы.

Вы могли бы просто сделать People a List < Лицо> но вы должны быть в порядке, раскрывая все потребителю своего класса.

Смежные вопросы