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