Вы можете видеть, что список, который я создал, является частным, и я хочу иметь возможность добавлять объекты в список, а также показывать пользователю список с помощью методов AddBook() и ShowBooks().
public class Library
{
private List<Book> Books = new List<Book>();
public static void AddBook()
{
}
public static void ShowBooks()
{
foreach (Book item in Books)
//This foreach-loop doesn't work since its a private list.
{
Console.WriteLine("Books found");
}
}
}
Цикл не работает, поскольку «требуется ссылка на объект для нестатического поля, метода или свойства», ссылающегося на список.
зачем делать статические методы?
какова цель этого кода? как вы планируете его использовать? какова цель частного списка? пожалуйста, объясните четко, что вы пытаетесь сделать
Если вы не хотите использовать статику в коллекции книг, сделайте следующее:
public class Library
{
private List<Book> Books = new List<Book>();
public void AddBook()
{
}
public void ShowBooks()
{
var library = new Library();
foreach (Book item in Books)
{
//This foreach-loop doesn't work since its a private list.
library.Books.Add(item);
Console.WriteLine("Books found");
}
}
}
Проблема в том, что ваш экземпляр List не является статическим, а ваши методы - статичными. Вы либо должны изменить свой список на статический, либо методы не должны быть статическими. Следуя хорошему объектно-ориентированному дизайну, я бы посоветовал вам удалить статический модификатор из ваших методов. Я также применил модификатор только для чтения к вашему списку и изменил его на ICollection, поскольку вам, похоже, не нужен индексированный доступ. А также применили некоторые общие шаблоны именования.
public class Library
{
private readonly ICollection<Book> _books = new List<Book>();
public void AddBook(Book book)
{
_books.Add(book);
}
public void ShowBooks()
{
foreach (Book item in _books)
{
Console.WriteLine("Books found");
}
}
}
Потому что из кода авторов список создается только один раз new List<Book>()
. Обратите внимание, что только список доступен только для чтения, а не элементы в списке. Вы по-прежнему можете добавлять новые элементы в список. В противном случае вы бы выставили его как IReadOnlyCollection<Book>
.
если вы хотите использовать статические методы, вы можете попробовать это
using System;
используя System.Collections.Generic;
public class Program
{
public static void Main()
{
Library.AddBook(new Book(){name = "test"});
Library.AddBook(new Book(){name = "test1"});
Library.ShowBooks();
}
}
public class Book
{
public string name;
}
public static class Library
{
private static List<Book> Books = new List<Book>();
public static void AddBook(Book b1)
{
Books.Add(b1);
}
public static void ShowBooks()
{
foreach (Book item in Books)
//This foreach-loop doesn't work since its a private list.
{
Console.WriteLine(item.name);
}
}
}
без статических методов вы можете попробовать это
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Library l1 = new Library();
l1.AddBook(new Book(){name = "test"});
l1.AddBook(new Book(){name = "test1"});
l1.ShowBooks();
}
}
public class Book
{
public string name;
}
public class Library
{
private List<Book> Books = new List<Book>();
public void AddBook(Book b1)
{
Books.Add(b1);
}
public void ShowBooks()
{
foreach (Book item in Books)
//This foreach-loop doesn't work since its a private list.
{
Console.WriteLine(item.name);
}
}
}
Переменная
Books
не является статической. Вам следует взглянуть на эта тема оstatic
.