为什么这个DirectoryInfo比较不起作用?

可能重复:
如何检查2个DirectoryInfo对象是否指向同一目录?

var dirUserSelected = new DirectoryInfo(Path.GetDirectoryName("SOME PATH")); var dirWorkingFolder = new DirectoryInfo(Path.GetDirectoryName("SAME PATH AS ABOVE")); if (dirUserSelected == dirWorkingFolder) { //this is skipped } if (dirUserSelected.Equals(dirWorkingFolder)) { //this is skipped } 

在调试时,我可以检查每个中的值,它们是相等的。 所以我猜这是另一个byval byref误解……请有人,我该如何比较这两件事?

我相信你想这样做:

 var dirUserSelected = new DirectoryInfo(Path.GetDirectoryName(@"c:\some\path\")); var dirWorkingFolder = new DirectoryInfo(Path.GetDirectoryName(@"c:\Some\PATH")); if (dirUserSelected.FullName == dirWorkingFolder.FullName ) { // this will be skipped, // since the first string contains an ending "\" and the other doesn't // and the casing in the second differs from the first } // to be sure all things are equal; // either build string like this (or strip last char if its a separator) // and compare without considering casing (or ToLower when constructing) var strA = Path.Combine(dirUserSelected.Parent, dirUserSelected.Name); var strB = Path.Combine(dirWorkingFolder.Parent, dirWorkingFolder.Name); if (strA.Equals(strB, StringComparison.CurrentCultureIgnoreCase) { //this will not be skipped } ............ 

在您的示例中,您正在比较两个不同的对象,这就是它们不相等的原因。 我相信你需要比较Paths所以使用上面的代码。

我做了一个谷歌搜索“DirectoryInfo相等”,并发现了几个很棒的结果,包括一个关于StackOverflow( 如何检查2个DirectoryInfo对象是否指向同一目录? )

如果两个Directory.FullName匹配,那么你知道它们相同的,但如果它们不匹配,你仍然不太了解。 有短名称,链接和联结以及许多其他原因,两个不同的字符串可以引用磁盘上的相同位置。

如果您指望确定两个字符串不是同一个位置,并且安全性受到威胁,那么您可能会创建一个安全漏洞。 小心翼翼。

正如Jaroslav Jandek所说(对不起,我无法发表评论,声誉不够)

因为它比较了这两个实例,而不是它们的值(两个引用)。

实际上,对于其他大量案件来说,情况也是如此! 对于前者

 IPAddress ip1 = IPAddress.Parse("192.168.0.1"); IPAddress ip2 = IPAddress.Parse("192.168.0.1"); 

两个IP地址表示相同的地址,但您有两个不同的IPAddress类实例 。 所以当然“ip1 == ip2”和“ip1.Equals(ip2)”都是假的,因为它们不指向同一个对象。

现在,如果你检查“ip1.Address == ip2.Address”,结果将为true,因为IPAddress.Address是一个“long”,所以你要比较2种值类型。 请注意,即使字符串是引用类型而不是值类型(但字符串确实是特殊字符串),“ip1.ToString()== ip2.ToString()”也将为true。

所以在你的情况下你想要比较FullName属性(它是一个字符串所以没问题)。

你说

是仅通过使用属性,即您正在比较值而不是实例的.FullName属性?

实际上,它更多地与属性是值类型还是引用类型有关。 同样,在比较引用类型时,在大多数情况下,比较将是它们是否指向同一个对象,但是可以覆盖方法或创建运算符,以便对对象的内容进行比较(再次像Jaroslav Jandek一样)已经指出了)。

HTH

因为它比较了这两个实例,而不是它们的值(两个引用)。