我写了一些类列表,这是我用来初始化类
的代码 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);
}
}
不幸的是,它显示的最后一张“专辑”的次数是我拥有的不同专辑的数量。任何人都可以帮助我吗?
答案 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);
}
}