C# 类中的静态整数在foreach循环中不可访问?
以下是我正在使用的代码:C# 类中的静态整数在foreach循环中不可访问?,c#,class,foreach,static,C#,Class,Foreach,Static,以下是我正在使用的代码: class Program { static StandardRoom room55 = new StandardRoom(55); static StandardRoom room45 = new StandardRoom(45); static List<StandardRoom> roomMap = new List<StandardRoom>() { room45, room
class Program
{
static StandardRoom room55 = new StandardRoom(55);
static StandardRoom room45 = new StandardRoom(45);
static List<StandardRoom> roomMap = new List<StandardRoom>() { room45, room55 };
static void Main(string[] args)
{
foreach(StandardRoom room in roomMap)
{
Console.WriteLine(room.roomId);
}
}
class StandardRoom
{
public static int roomId;
public StandardRoom(int roomNum)
{
roomId = roomNum;
}
}
类程序
{
静态标准间55=新标准间(55);
静态标准间45=新标准间(45);
静态列表roomMap=新列表(){room45,room55};
静态void Main(字符串[]参数)
{
foreach(roomMap中的标准房间)
{
控制台.WriteLine(房间.roomId);
}
}
班级标准间
{
公共静态室内ID;
公共标准间(int roomNum)
{
roomId=roomNum;
}
}
我的问题是:
无法使用实例引用访问成员“room.roomId”;请改为使用类型名对其进行限定
我真的不知道如何解决这个问题
class StandardRoom
{
public int roomId {get; set;} // modified
}
这里不需要静态字段,而是需要公共实例属性
如果您想确保不能从类外部对其进行更改,则将setter设置为private或将其完全删除,这对于c#v6很好
为什么不是静态的?静态是在类型本身上跟踪的单个实例。您想为每个房间实例定义一个roomid,因此它必须是一个实例变量。您几乎不应该使用静态字段/属性。为什么会出现错误: 您正在引用静态值,就像它是实例值一样:
room.roomId
相反,可以使用类型名称限定静态值,以将其引用为静态值:
StandardRoom.roomId
静态成员与类型本身相关联,而不是与该类型的任何给定实例相关联
您实际应该做什么:
更仔细地看一下您的实现,您很可能希望该值实际上是实例而不是静态的:
public int roomId;
这是因为实例构造函数正在设置值。如果它是静态值,则对象的任何新实例都将全局更改该值。因此,列表
中的每个元素似乎都具有相同的值,以最后设置的值为准
通过使其成为实例成员而不是静态成员,每个实例将具有独立于其他实例的自身值
另外:
由于该值是公共的,因此在良好的形式下,它可能应该是属性而不是字段:
public int RoomId { get; set; }
从
StandardRoom
类中的roomId
字段中删除static关键字。因此,基本上,如果您有静态成员,您可以按类名而不是对象使用它(逻辑:静态成员在所有对象中共享),但如果您有非静态成员,则应按对象使用它。因此RoomId
不应是静态的,而应是公共字段。
您也可以在
StandardRoom
类声明中进行其他更改。例如将其设置为Singleton、sealed或仅设置属性、set或两者,但这一切都取决于您的需求和应用程序设计。不要将其设为静态。您的实现表示它需要位于实例上。您的意思是将其从roomId中删除因为类本身不是静态的。@juharr是的,这就是我的意思。编辑。
public int RoomId { get; set; }