类中的静态整数在foreach循环中无法访问?

时间:2016-11-10 20:40:55

标签: 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, 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;
    }
}

我的问题是:

  

会员&#34; room.roomId&#34;无法使用实例引用访问;用类型名称来限定它。

我真的不确定如何解决这个问题。

4 个答案:

答案 0 :(得分:5)

class StandardRoom
{
    public int roomId {get; set;} // modified
}

您不需要静态字段,您需要公共实例属性。

如果你想确保它不能从课外改变,那么将setter设为私有或完全删除它,这对c#v6来说很好。

class StandardRoom
{
    public int roomId {get; private set;} // modified
    public StandardRoom(int roomNum)
    {
        this.roomid = roomNum;
    }
}

现在为什么不静电?静态是在类型本身上跟踪的单个实例。您想为每个房间实例定义一个房间,因此它必须是一个实例变量。你几乎不应该使用静态字段/属性。

答案 1 :(得分:0)

roomId类中的StandardRoom字段中删除static关键字。

答案 2 :(得分:0)

所以基本上如果你有静态成员,你可以按类名而不是对象使用它(逻辑:静态成员在所有对象中共享),但是如果你有非静态成员,你应该按对象使用它。所以RoomId不应该是静态的,它应该是一个公共领域。 您也可以在StandardRoom类声明中进行其他更改。就像制作唱片,密封或制作属性一样,只设置,设置或两者兼而有之,但这一切都取决于您的要求和应用设计。

答案 3 :(得分:-1)

为什么会收到错误:

您正在引用静态值,就好像它是一个实例值:

room.roomId

相反,可以使用类型名称限定静态值,以将其作为静态值引用:

StandardRoom.roomId

静态成员与本身类型相关联,而不是与该类型的任何给定实例相关联。

你应该做什么:

仔细观察您的实现,似乎很可能您认为实际上是实例的值而不是静态的:

public int roomId;

这是因为您的实例构造函数正在设置值。如果它是静态值,则对象的任何新实例都将全局更改该值。因此,List<StandardRoom>中的每个元素看起来都具有相同的值,无论最后设置哪个值。

通过使其成为实例成员而不是静态成员,每个实例都有自己独立于其他实例的值。

<强>此外:

由于值是公共的,因此它应该是一个属性而不是字段:

public int RoomId { get; set; }