ReferenceEquals用字符串返回false

时间:2014-05-14 15:41:37

标签: c#

    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它会跳过...

2 个答案:

答案 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有一些非常具体的用例,我只需要使用一次。