使用静态属性打印实例数据

本文关键字:实例 数据 打印 属性 静态 | 更新日期: 2023-09-27 18:04:25

我写了一些类的列表,下面是我用来初始化类的代码

  public class Album
   {
       static public int IDNumber { get; set; }
       static public string AlbumName { get; set; }
       static public string Artist { get; set; }
       static public int ReleaseDate { get; set; }
       static public int TrackAmount { get; set; }
       static public string Location { get; set; }
       static public int Rating { get; set; }
       public Album(int _id, string _name, string _artist, int _releasedate, int _trackamount, string _location, int _rating)
       {
           IDNumber = _id;
           AlbumName = _name;
           Artist = _artist;
           ReleaseDate = _releasedate;
           TrackAmount = _trackamount;
           Location = _location;
           Rating = _rating;
       }
   }

我像这样从控制台添加所有内容:

   static private List<Album> AlbumsList = new List<Album>();
   public void addnew()
   { 
       //getting from console to separate variables with names below in .add method
       AlbumsList.Add(new Album(ID, AlbNm, Art, RelD, TrAmn, Loc, Rat));  
       currid++;
   }
我还添加了打印代码:
   static public void printlist(List<Album>AlbumsList)
   {
       foreach (Album IDNumber in AlbumsList)
       {
           Console.WriteLine(Album.IDNumber + Album.AlbumName + Album.Artist + Album.ReleaseDate + Album.TrackAmount + Album.Location + Album.Rating);
       }
   }

不幸的是,它显示最后一个"专辑"的次数与我拥有的不同专辑的次数一样多。有人能帮我吗?

使用静态属性打印实例数据

你的所有属性都是static——这意味着它们与类型相关,而不是与类型的任何一个实例相关。(并不是这些值"被所有实例共享"——而是它们与任何实例完全无关。)

您应该通过删除static修饰符将它们改为instance属性。然后你也需要改变你的foreach循环。注意,在当前的foreach循环中,您是如何完全忽略循环变量(IDNumber)的?这是有问题的暗示。试试这个:

// Variable and method names changed to be more readable and conventional.
// Modifier order also changed for convention.
public static void PrintList(List<Album> albums)
{
    foreach (Album album in albums)
    {
        Console.WriteLine(album.IDNumber + album.AlbumName + album.Artist + 
                          album.ReleaseDate + album.TrackAmount + album.Location + 
                          album.Rating);
    }
}

或者更好听一点:

static public void PrintList(List<Album> albums)
{
    foreach (Album album in albums)
    {
        Console.WriteLine("{0} {1} {2} {3} {4} {5} {6}",
                          album.IDNumber, album.AlbumName, album.Artist,
                          album.ReleaseDate, album.TrackAmount, album.Location,
                          album.Rating);
    }
}

所有属性都是静态的。这意味着您的Album类的所有实例在这些属性中共享相同的值。因此,当您初始化专辑属性时,您只需覆盖每个专辑中相同的属性集,因此您最终获得分配给这些属性的最后值:这就是为什么循环打印出最后值的原因。

您需要从属性声明中删除static关键字,以便属性成为特定于实例的:两个Album对象可以有不同的名称。

你的foreach循环也坏了,必须修复。您现在正在使用Album.AlbumName,但是一旦您使AlbumName属性特定于实例(非静态),这将不再工作-您必须通过实例访问每个属性,而不是通过声明它的类。

你的foreach循环应该是这样的:

foreach (Album album in albumList)
{
    Console.WriteLine ( album.IDNumber + ", " + album.AlbumName + ... );
}

注意代码是如何使用album实例变量来访问专辑属性,而不是使用Album类。

您的所有属性都是静态的,这意味着状态在类的每个单独实例之间共享。Album的所有属性都应该是非静态的。当访问属性以打印它们时,您应该通过您拥有的Album实例(您称之为IDNumber,这对于相册来说是一个坏名字)而不是通过类型本身来访问它们。

所有属性都是静态的。

你正在更新构造函数中静态属性的值。

public class Album
   {
       public int IDNumber { get; set; }
       public string AlbumName { get; set; }
       public string Artist { get; set; }
       public int ReleaseDate { get; set; }
       public int TrackAmount { get; set; }
       public string Location { get; set; }
       public int Rating { get; set; }
       public Album(int _id, string _name, string _artist, int _releasedate, int _trackamount, string _location, int _rating)
       {
           IDNumber = _id;
           AlbumName = _name;
           Artist = _artist;
           ReleaseDate = _releasedate;
           TrackAmount = _trackamount;
           Location = _location;
           Rating = _rating;
       }
   }

同样,在foreach循环中,您正在打印静态属性。您需要打印正在遍历的实例的值。

   static public void printlist(List<Album>AlbumsList)
   {
       foreach (Album alb AlbumsList)
       {
           Console.WriteLine(alb.IDNumber + alb.AlbumName + alb.Artist + alb.ReleaseDate + alb.TrackAmount + alb.Location + alb.Rating);
       }
   }