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

时间:2014-05-21 19:48:12

标签: c#

我写了一些类列表,这是我用来初始化类

的代码
  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);
       }
   }

不幸的是,它显示的最后一张“专辑”的次数是我拥有的不同专辑的数量。任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:5)

所有属性都是静态 - 这意味着它们与类型相关,而不是与该类型的任何一个实例相关。 (并非所有实例共享的值都是#34; - 它们与任何实例完全无关。)

您应该将它们设为实例属性,只需删除static修饰符即可。然后,您还需要更改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);
    }
}

答案 1 :(得分:2)

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

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

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

您的foreach循环应该类似于:

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

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

答案 2 :(得分:1)

所有属性都是静态的,这意味着状态在类的每个实例之间共享。 Album的所有属性都应该是非静态的。当访问属性以将其打印出来时,您应该通过您拥有的Album实例访问它们(您称之为IDNumber,而对于记录而言,这是一个错误的专辑名称)而不是而不是通过类型本身。

答案 3 :(得分:1)

您的所有属性都是静态的。

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

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