即使创建了新实例,Foreach也会覆盖列表项(内部)c#

时间:2014-04-13 21:18:10

标签: c#

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;
    }

上面的代码遍历了所有可用的Nics,并获得了一个IPV4地址不是环回(127.0.0.1)和 正如你所看到的,我实际上在我的Loop中添加了一个Adapter类的新实例到我的Adapters列表中。 但是,如果我没有创建我的对象的新实例,它会使用新的适配器覆盖整个列表,如果我没有创建我的对象的新实例

有人可以对此有所了解吗? 我正处于拔毛的地步 这可能是一个忽略一件简单事情的例子,我已经盯着自己看不清楚了。

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

PS 如果我使用一个字符串列表并将ip和name连接成一个字符串..这段代码工作正常。

以防万一 我的适配器类

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; }


    }

1 个答案:

答案 0 :(得分:9)

您的问题是Adapter类的字段被声明为static。从两个属性中取出static关键字,它不会显示此行为:

private string _name;
private string _ipAdress;

将它们设为static意味着Adapter类的所有实例共享相同的存储值。