Как добавить объекты в приватный список методом?

Вы можете видеть, что список, который я создал, является частным, и я хочу иметь возможность добавлять объекты в список, а также показывать пользователю список с помощью методов 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");
        }
    }
}

Цикл не работает, поскольку «требуется ссылка на объект для нестатического поля, метода или свойства», ссылающегося на список.

Переменная Books не является статической. Вам следует взглянуть на эта тема о static.

Nik. 27.05.2019 14:27

зачем делать статические методы?

Andrei Dragotoniu 27.05.2019 14:30

какова цель этого кода? как вы планируете его использовать? какова цель частного списка? пожалуйста, объясните четко, что вы пытаетесь сделать

Andrei Dragotoniu 27.05.2019 14:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
522
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы не хотите использовать статику в коллекции книг, сделайте следующее:

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>.

wertzui 27.05.2019 14:50

если вы хотите использовать статические методы, вы можете попробовать это

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);
        }
    }
}

Другие вопросы по теме