[英]IPv6: Why changing ScopeId of System.Net.IPAddress is not reflected at ToString() representation?
昨天我遇到了一个看起来像.NET错误的东西。
IPAddress addr = IPAddress.Parse("fe80::1111:2222:abc%11"); // ScopeId is 11
string s1 = addr.ToString(); // I obviously see fe80::1111:2222:abc%11
addr.ScopeId = 0; // ScopeId is zero from now
string s2 = addr.ToString(); // I expect to see fe80::1111:2222:abc
为什么即使更改了ScopeId
s1
的内容仍与s2
相同? 在调试器的“监视”窗口中,我看到范围值确实发生了变化。 但是内部字符串字段没有影响。
当然,我使用各种IPv6地址和不同的作用域ID进行了尝试-行为是相同的。 我错过了什么?
我将其称为.NET Framework中的错误。
如果查看IPAddress类的源代码:
http://referencesource.microsoft.com/#System/net/System/Net/IPAddress.cs
您会看到.ToString()
方法实际上将结果缓存到名为m_ToString
的私有字段中。 但是,如果您随后查看ScopeId
属性的设置器,则会看到它更改了m_ScopeId
和m_Address
的私有字段,但不会清除m_ToString
值。
如果查看Address属性,则会看到它们在设置该属性时清除了m_ToString
字段。
如果您想解决这个问题,可以在这里进行以下操作:
通过使用.GetAddressBytes()
方法传递给构造函数以创建新实例。 这将使您的ScopeId
为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.