private class global
{
public static int a = 0;
public static int val = 0;
public static int c = -1;
public static string g = "";
}
private void button8_Click(object sender, EventArgs e)
{
global.a = global.a + 1;
global.c = global.c + 1;
string a = label2.Text;
if (string.ReferenceEquals(a, global.g))
{
MessageBox.Show("a");
//dataGridView1.Rows[global.c].Cells[1].Value = global.a;
//dataGridView1.Rows[global.c].Cells[2].Value = global.val * global.a;
}
else
{
dataGridView1.Rows.Add(label2.Text, global.a, global.val);
}
global.g = label2.Text;
}
如果再次使用button8
按下label2.Text
,则应调用MessageBox.Show()
但不知何故global.g = label2.text
不起作用。我尝试过:
string a = "";
string b = "";
if (string.ReferenceEquals(a, b))
{
MessageBox.Show("a");
}
它工作正常但后来我将b更改为global.g它会跳过...
答案 0 :(得分:3)
正如上面qqbenq所述......由于字符串实习,你应该使用String.Equals
。
你应该不使用引用相等来比较字符串......按照Microsoft
你不应该使用ReferenceEquals 确定字符串相等。
在链接中进一步详细说明......
同一程序集中的常量字符串始终由 运行。也就是说,每个唯一文字字符串只有一个实例 保持。但是,运行时不保证字符串 在运行时创建的是interned,也不保证两者相等 不同程序集中的常量字符串被实现。
专门回答你的问题......我该如何更改我的代码...
编辑,如@Servy所述,在a为空的情况下使用静态string.equals
。
string a = "";
string b = "";
if (string.Equals(a, b))
{
MessageBox.Show("a");
}
您几乎总是使用Equals
来比较引用类型。如果你真的想检查它们是否相等但实际上指向相同的参考,那么只能使用ReferenceEquals
。
答案 1 :(得分:3)
此处的问题是使用ReferenceEquals代替Equals。
ReferenceEquals将检查引用的相等性 - 也就是说,内存中的指针指向底层变量,而不是值本身。这是一个静态方法,因为它具有如此精确的用法,它永远不应被派生类覆盖或隐藏。
另一方面,等于比较对象本身,从而确定它们的基础值是否相同。由于它是一个字符串,因此您还有Equals的重载,它们可以准确指定字符串的比较方式。
因此,改变
if (string.ReferenceEquals(a, global.g))
{
MessageBox.Show("a");
//dataGridView1.Rows[global.c].Cells[1].Value = global.a;
//dataGridView1.Rows[global.c].Cells[2].Value = global.val * global.a;
}
到
if (string.Equals(a, global.g)) // Static string.Equals prevents a NullReferenceException if 'a' is null
{
MessageBox.Show("a");
//dataGridView1.Rows[global.c].Cells[1].Value = global.a;
//dataGridView1.Rows[global.c].Cells[2].Value = global.val * global.a;
}
通常,您希望使用Equals进行比较。 ReferenceEquals有一些非常具体的用例,我只需要使用一次。