C# 即使在c中创建了新实例,Foreach也会覆盖列表项

C# 即使在c中创建了新实例,Foreach也会覆盖列表项,c#,C#,上面的代码将遍历所有可用的NIC,并获取IPV4地址不是环回127.0.0.1和127.0.1的NIC 如您所见,我实际上是在循环中向适配器列表中添加了适配器类的一个新实例。 但是,如果我没有创建对象的新实例,它会像往常一样使用新适配器覆盖整个列表 有人能解释一下吗? 我正处在拔头发的时候 这也许是忽略了一件简单的事情,我对这件事视而不见 适配器类只有2个字符串属性 PS 如果我使用字符串列表并将ip和名称合并为一个字符串。。这段代码运行良好 以防万一 我的适配器类 private List&l

上面的代码将遍历所有可用的NIC,并获取IPV4地址不是环回127.0.0.1和127.0.1的NIC 如您所见,我实际上是在循环中向适配器列表中添加了适配器类的一个新实例。 但是,如果我没有创建对象的新实例,它会像往常一样使用新适配器覆盖整个列表

有人能解释一下吗? 我正处在拔头发的时候 这也许是忽略了一件简单的事情,我对这件事视而不见

适配器类只有2个字符串属性

PS 如果我使用字符串列表并将ip和名称合并为一个字符串。。这段代码运行良好

以防万一 我的适配器类

private List<Adapter> GetAllIPV4Interfaces()
    {
        var adapters = new List<Adapter>();
        NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach(var nic in interfaces)
        {

            var ipAddress = nic.GetIPProperties()
                .UnicastAddresses.FirstOrDefault(ip => ip.Address.AddressFamily == AddressFamily.InterNetwork && 
                    !IPAddress.IsLoopback(ip.Address));
            if (ipAddress != null)
            {                                  
                adapters.Add(new Adapter{IPAdress = ipAddress.Address.ToString(), Name = nic.Name});
            }
        }
        return adapters;
    }

您的问题是适配器类的字段声明为静态。从两个属性中去掉static关键字,它将不会显示此行为:

class Adapter
    {
        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        /// <summary>
        /// Gets or sets the ip address.
        /// </summary>
        public string IPAdress
        {
            get { return _ipAdress; }
            set { _ipAdress = value; }
        }

        /// <summary>
        /// Gets or sets the _name.
        /// </summary>
        private static string _name { get; set; }

        /// <summary>
        /// Gets or sets the _ip adress.
        /// </summary>
        private static string _ipAdress { get; set; }


    }

将它们设置为静态意味着适配器类的所有实例都共享相同的存储值。

从您的代码中,恐怕不可能找到问题所在。。确切地说。。我真的不明白为什么我会得到这些结果。但我真的是:显示适配器是定义的吗?我打赌问题在于如何调用GetAllIPV4Interfaces;这怎么会是一个问题,当它是一个方法的结果,即使是通过这是一个问题?。代码的行为就像我没有创建适配器的新实例一样,尽管我很清楚am@AlexInTime:刚刚注意到您使用的是私有属性而不是字段。不需要这样做,所以可以将它们转换为字段,或者在自动属性上使用公共getter和私有setter。
private string _name;
private string _ipAdress;