【问题标题】:How to add objects to a private list with a method?如何使用方法将对象添加到私有列表?
【发布时间】:2019-10-13 00:40:48
【问题描述】:

您可以看到我创建的列表是私有的,我希望能够将对象添加到列表中,并通过方法 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 变量不是静态的。你应该看看this thread about static
  • 为什么要将方法设为静态?
  • 这段代码的目的是什么?你打算如何使用它?私人名单的目的是什么?请清楚说明您要做什么

标签: c# list object add private


【解决方案1】:

如果您不想在图书集合上使用静态,请执行以下操作:

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

【讨论】:

    【解决方案2】:

    问题在于您的列表实例是非静态的,而您的方法是。您要么必须将列表更改为静态,要么将方法更改为非静态。遵循良好的 OO 设计,我建议您从方法中删除静态修饰符。我还对您的列表应用了只读修饰符并将其更改为 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&lt;Book&gt;()。请注意,只有列表是只读的,而不是列表中的项目。您仍然可以将新项目添加到列表中。否则,您会将其公开为IReadOnlyCollection&lt;Book&gt;
    【解决方案3】:

    如果你想使用静态方法,你可以试试这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2011-10-07
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2023-03-31
      • 2019-09-13
      相关资源
      最近更新 更多