当我使用stepinto时,公共方法“ NyBok”起作用了,并且将我想要的内容添加到列表中,但是当我尝试使用VisaBöcker()显示列表时,该列表为空。

{
    class Bibliotikarie
    {
        private List<Bok> Böcker = new List<Bok>();
        public static void VisaBöcker()
        {
            var gg = new Bibliotikarie();
            foreach (Bok item in gg.Böcker)
            {
                Console.WriteLine();
                Console.WriteLine("\"" + item.Titel + "\" av " + item.Skribent + ". År " + item.UtÅr + ".  ( " + item.Typ + " )");
                Console.WriteLine();
            }
        public static void NyBok()
        {
             var gg = new Bibliotikarie();
             gg.Böcker.Add(new Roman(TitSvar, FörSvar, ÅrSvar));
        }
    }

         class Bok
         {
             public string Titel;
             public string Skribent;
             public string Typ;
             public int UtÅr;
         }

         class Roman : Bok
         {
             public Roman(string _Titel, string _Skribent, int _UtÅr)
             {
                 Titel = _Titel;
                 Skribent = _Skribent;
                 UtÅr = _UtÅr;
                 base.Typ = "Roman";
             }




NyBok()的代码缩短了,因为它对于瑞典语用户来说是很多不必要的代码。)

最佳答案

在NyBok中,您将创建Bibliotikarie类的新实例,然后将项目添加到其Böcker变量中。您只能这样做是因为Roman类在Bibliotikarie类的内部,否则是Böcker私有变量,您不能在Bibliotikarie类的外部使用它。

但是,在该方法中创建的gg变量是局部变量,当您从该方法退出时,该变量将被丢弃,并且其中的所有内容都会被销毁。
现在,当您调用方法VisaBöcker时,将创建类Bibliotikarie的另一个实例,并且该实例具有一个显然为空的新List。

我会在您的代码中更改很多逻辑。首先,Roman类不应该将项目添加到Bibliotikarie中,而接下来,我将从Bibliotikarie类中提取内部类,并使它们可以由处理Bibliotikarie实例的外部代码访问。

现在我们可以

public class Bibliotikarie
{
    private List<Bok> Böcker = new List<Bok>();

    // This method adds a Bok instance or a derived one to your list
    public void AddBok(Bok b)
    {
        Böcker.Add(b);
    }

    public void VisaBöcker()
    {
        foreach (Bok item in Böcker)
        {
            Console.WriteLine($"\r\n\"{item.Titel}\" av {item.Skribent}. År {item.UtÅr}.  ( {item.Typ} )\r\n");
        }
    }
}
public class Bok
{
    public string Titel;
    public string Skribent;
    public string Typ;
    public int UtÅr;
}

public class Roman : Bok
{
    public Roman(string _Titel, string _Skribent, int _UtÅr)
    {
        Titel = _Titel;
        Skribent = _Skribent;
        UtÅr = _UtÅr;
        base.Typ = "Roman";
    }
}


这种结构将允许编写这样的代码

void Main()
{
    Bibliotikarie bb = new Bibliotikarie();
    bb.AddBok(new Roman("Example1", "Test1", 1));
    bb.AddBok(new Roman("Example2", "Test2", 2));
    bb.VisaBöcker();
}


现在,您只有Bibliotikarie类的一个实例,将项目添加到该实例,并从包含填充列表的同一实例中显示它们。

关于c# - 如何成功将对象添加到私有(private)列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56306432/

10-12 22:13