我在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)
任何理由为什么会这样?
我最近被介绍到一个大型代码库,并注意到所有的字符串比较都使用String.Equals()而不是==
你觉得这是什么原因?
我读了Jon Skeet的测验,我想知道为什么我的第二个样本在第一个样本时不起作用.
为什么这会产生true:
object x = new string("".ToArray());
object y = new string("".ToArray());
Console.WriteLine(x == y); //true
Run Code Online (Sandbox Code Playgroud)
但是这个没有:
var k="k";
//string.intern(k); // doesn't help
object x = new string(k.ToArray());
object y = new string(k.ToArray());
Console.WriteLine(x == y); //false
Run Code Online (Sandbox Code Playgroud)
我在vs2010上使用fw 4.5.
幸运的是我也安装了vs2005,结果相同:

这有效:
short value;
value = 10 > 4 ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
这有效:
short value;
value = "test" == "test" ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
这不起作用:
short value;
string str = "test";
value = "test" == str ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
这也不是:
short value;
string str = "test";
value = "test".Equals(str) ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
最后两种情况我收到以下错误:
Cannot implicitly convert type 'int' to 'short'.
An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)
为什么我必须对最后两个案例进行演绎而不是对前两个案例进行演绎?
我注意到了
string1.Length == string2.Length && string1 == string2
Run Code Online (Sandbox Code Playgroud)
在大字符串上比稍微快一点
string1 == string2
Run Code Online (Sandbox Code Playgroud)
这是真的?在比较实际字符串之前比较大字符串长度是一种很好的做法吗?
对于字符串比较,哪种方法更好(和安全):
string s1="Sarfaraz";
string s2="Nawaz";
bool result1 = (s1==s2) ;//approach 1
bool result2 = s1.Equals(s2) ;//approach 2
Run Code Online (Sandbox Code Playgroud)
或两者在引擎盖下相同?
如果我有一个变量从DB 中提取一串true或
哪一个false,
这将是检查其值的首选方法?
string value = "false";
if(Boolean.Parse(value)){
DoStuff();
}
Run Code Online (Sandbox Code Playgroud)
我知道解析bool有不同的方式 - 这是一个例子
或
string value = "false";
if(value == "true"){
DoStuff();
}
Run Code Online (Sandbox Code Playgroud)
我在数据库string格式中提取了很多真/假值,想知道这些方法是否会产生任何性能差异?
我在读完这篇文章之后来到这里并且没有找到相关的答案 - 所以在你阅读整个问题之前,请不要将其标记为副本.
我一直在使用反射器并进行调查.Object.Equals我看到的是:
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
Run Code Online (Sandbox Code Playgroud)
而且RuntimeHelpers.Equals看起来是这样的:
// System.Runtime.CompilerServices.RuntimeHelpers
/// <summary>Determines whether the specified <see cref="T:System.Object" /> instances are considered equal.</summary>
/// <returns>true if the <paramref name="o1" /> parameter is the same instance as the <paramref name="o2" /> parameter, or if both are null, or if o1.Equals(o2) returns true; otherwise, false.</returns>
/// <param name="o1">The first object to …Run Code Online (Sandbox Code Playgroud) 请看下面的代码:
using System;
class MyClass
{
static void Main()
{
object o = ".NET Framework";
object o1 = new string(".NET Framework".ToCharArray());
Console.WriteLine(o == o1);
Console.WriteLine(o.Equals(o1));
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
False
True
现在考虑这个:
using System;
class MyClass
{
static void Main()
{
object o = ".NET Framework";
object o1 = ".NET Framework";
Console.WriteLine(o == o1);
Console.WriteLine(o.Equals(o1));
}
}
Run Code Online (Sandbox Code Playgroud)
其结果是:
真
真
"=="比较对象引用是否相同,而".Equals()"比较内容是否相同.我想知道这些代码之间有什么不同?!
object o1 = new string(".NET Framework".ToCharArray());
Run Code Online (Sandbox Code Playgroud)
和
object o1 = ".NET Framework";
Run Code Online (Sandbox Code Playgroud)
他们两个都是一个对象,但为什么结果不同?