使用静态属性打印实例数据
本文关键字:实例 数据 打印 属性 静态 | 更新日期: 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);
}
}