IPv6:为什么更改System.Net.IPAddress的ScopeId没有反映在ToString()表示中
本文关键字:ToString 表示 ScopeId 为什么 System IPAddress Net IPv6 | 更新日期: 2023-09-27 18:26:47
昨天我遇到了一个.NET bug。
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中的一个bug。
如果您查看IPAddress类的源代码:
http://referencesource.microsoft.com/#System/net/System/Net/IPAddress.cs
您将看到.ToString()
方法实际上将结果缓存到一个名为m_ToString
的私有字段中。但是,如果查看ScopeId
属性的setter,会发现它更改了m_ScopeId
和m_Address
的私有字段,但没有清除m_ToString
值。
如果查看Address属性,您会发现在设置该属性时,它们会清除m_ToString
字段。
如果你想解决问题,你可以做他们在这里做的事情:
如何确定两个IPv6地址之间的相等性?
通过使用CCD_ 11方法传递给构造函数来创建新实例。这将使您的ScopeId
为零。