我在Silverlight应用程序中有一个比较2个字符串的条件,由于某种原因,当我使用==它时返回false而.Equals()返回true.
这是代码:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Run Code Online (Sandbox Code Playgroud)
任何理由为什么会这样?
可能重复:
C#中字符串比较方法的差异
在.NET中有许多字符串比较方法,我只是想确认哪一个是最好的考虑性能.
string.Equals()
string.Compare()
string.CompareTo()
string.CompareOrdinal()
string.ReferenceEquals()
if (str1 == str2)
Run Code Online (Sandbox Code Playgroud) 我有一个字符串,周围可能有空格字符,我想检查它是否基本上是空的.
有很多方法可以做到这一点:
1 if (myString.Trim().Length == 0)
2 if (myString.Trim() == "")
3 if (myString.Trim().Equals(""))
4 if (myString.Trim() == String.Empty)
5 if (myString.Trim().Equals(String.Empty))
Run Code Online (Sandbox Code Playgroud)
我知道这通常是过早优化的明显案例,但我很好奇,并且有可能做到这一点足以产生性能影响.
那么哪一个是最有效的方法呢?
有没有更好的方法我没想过?
编辑:此问题的访问者注意事项:
对这个问题进行了一些非常详细的调查 - 特别是来自Andy和Jon Skeet.
如果你在搜索某些内容时偶然发现了这个问题,那么至少阅读Andy和Jon的帖子是非常值得的.
似乎有一些非常有效的方法,最有效的方法取决于我需要处理的字符串的内容.
如果我无法预测字符串(在我的情况下我不能预测),Jon的IsEmptyOrWhiteSpace方法似乎通常更快.
谢谢大家的意见.我将选择安迪的答案作为"正确"的答案仅仅是因为他应该为他所付出的努力赢得声誉,而乔恩已经拥有了十亿美元的声誉.
我知道字符串是不可变的,所以当你更改字符串引用的值时,.NET会在堆上创建一个全新的字符串.
但是如果你不改变字符串引用的值呢?相反,你只需将它传递给一个函数ByVal- 这个操作是否也复制了堆上的字符串值?我倾向于"不",但我想证实.
例如:
Public Function IsStringHello(ByVal test As String) As Boolean
Return (String.Compare(test, "Hello") = 0)
End Function
Run Code Online (Sandbox Code Playgroud)
通话程序:
Dim myWord as String = "Blah"
Dim matchesHello as Boolean = IsStringHello(myWord)
Run Code Online (Sandbox Code Playgroud)
我知道myWord按值传递会产生"Blah" 引用的副本,但由于我没有尝试更改字符串本身,它是否会在堆上创建另一个字符串副本?
c# ×3
.net ×2
string ×2
byref ×1
byval ×1
coding-style ×1
equals ×1
optimization ×1
performance ×1
vb.net ×1