2012-07-31 1 views
1

Я пытаюсь научиться сериализовать XML-файлы, и я попал в проблему с доступом к переменной, находящейся внутри класса, находящегося внутри списка. Вот код объявления:Как получить доступ к переменной, находящейся внутри класса, находящегося внутри списка?

public class Library{ 
    public string name; 
    public List<Book> books; 
} 

public class Book{ 
    public string name; 
} 

Вот код, где я заполнить список, что я собираюсь сериализации, но всякий раз, когда я запускаю этот код все library.books.name всегда в конечном итоге равен последнему, что я сохраненная книга как, в данном случае «Xenocide».

public void MakeXML(){ 
     Library library = new Library(); 
     library.books = new List<Book>();  
     library.name = "Red"; 
     Book book = new Book(); 
     book.name = "Hobbit"; 
     library.books.Add(book); 
     book.name = "Xenocide"; 
     library.books.Add(book); 
    } 

мне было интересно, если есть способ Асесс имя переменной внутри класса книги внутри списка книг, но я не могу найти что-то. Любая помощь будет оценена, спасибо.

ответ

4

Как просто:

library.books[0].name 
+0

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

4

Вы также есть проблемы, где вы добавляете SAME книгу в библиотеку два раза, и только изменяя свое название между ними. Вам нужно создать два отдельных объекта книги и добавить их в список.

Book book1 = new Book(); 
    book1.name = "Hobbit"; 
    library.books.Add(book1); 
    Book book2 = new Book() 
    book2.name = "Xenocide"; 
    library.books.Add(book2); 
+0

Я знаю, что использовал ту же книгу, потому что в конце концов я хочу переделать этот код как можно более гибким. Я не хотел создавать новую переменную для каждой книги в каждом списке, и я не ожидал, что список будет обновляться, когда я обновляю переменную (что было глупо с моей стороны). –

+0

Вы можете повторно использовать одну и ту же переменную * имя *, если хотите, но вам все равно придется называть 'new Book()' для каждой книги, которую вы хотите добавить. Помните, что в списке хранятся * ссылки * на книги, а не на их копии. – DGH

0

Вы столкнулись с тем, о чем идет ООП. Как говорит DGH, вы дважды добавляете одну и ту же книгу в список и просто меняете имя между ними.

Вы, в основном создает новый объект Book называется book:

Book book = new Book(); 

Вы затем назначить имя поля book в "Хоббите":

book.name = "Hobbit"; 

Вы затем добавить book к вашему Library.books Поле списка:

library.book.Add(book); 

Вы тогда изменение затем имя поля исходной книги «Xenocide» и добавить его в список

book.name = "Xenocide"; 

Эта предыдущая строка, что я думаю, что вы забываете. book - это единственный объект. Вы можете передать этот конкретный пример из Book в любой другой класс или метод, и вы всегда работаете с тем же book. Большинство изменений, которые вы делаете по пути, всегда воздействуют на оригинальную книгу (есть некоторые исключения, но не так много)

Вам нужно создать новый Book в любое время, когда вы хотите другой Book. Это необязательно, это требование любого ориентированного на объект языка.

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