C#相等判断实例报错分析及解决_Ubuntu_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • Ubuntu

    当前位置:主页 > 服务器教程 > Ubuntu >

    C#相等判断实例报错分析及解决

    时间:2019-07-22|栏目:Ubuntu|点击:
  • 线上报来一个问题,说用户的数据丢失了。开发经过紧张的调查。终于找到了原因。

    if (newData.GetValue(rowIndex) == oldData.GetValue(rowIndex))
    {

    ..................

    }


    public object GetValue(string fieldName))
    {
        ...............
        return values[filedName];  //这是一个简单类型: int,string
    }

    问题出在了 if 中的比较上。  values[rowIndex] 中保存的是一个整数,开发认为两个整数比较实用 ==  就可以了。

    但是 values[rowIndex] 中的整数经过 GetValue返回后被作为 object 对象返回了,这时如果还使用 == 进行比较就会出现不等的情况。

    我们来看一个更全面的例子:

    static void Main(string[] args)
    {
        object value1 = new object();
        object value2 = new object();

    value1 = 2;
        value2 = 2;

    Console.WriteLine("value1  == value2 {0}", (value1 == value2).ToString());
        Console.WriteLine("vvalue1.Equals(value2) {0}", value1.Equals(value2).ToString());
        Console.WriteLine("Equals(value1, value2) {0}", Equals(value1, value2).ToString());
        Console.WriteLine("ReferenceEquals(value1,value2) {0}", ReferenceEquals(value1,value2).ToString());
    }

    运行结果

    value1  == value2 False
    value1.Equals(value2) True
    Equals(value1, value2) True
    ReferenceEquals(value1,value2) False

    如果我们将value1, value2 都定义为数字,但是一个是long,一个是uint.

    static void Main(string[] args)
    {
        long value1 = 2;
        int value2 = 2;

    Console.WriteLine("value1  == value2 {0}", (value1 == value2).ToString());
        Console.WriteLine("value1.Equals(value2) {0}", value1.Equals(value2).ToString());
        Console.WriteLine("Equals(value1, value2) {0}", Equals(value1, value2).ToString());
        Console.WriteLine("ReferenceEquals(value1,value2) {0}", ReferenceEquals(value1,value2).ToString());

    }

    看一下运行结果 ,使用  ==  ,和 value1.Equals  方法比较是相等的。

    value1  == value2 True
    value1.Equals(value2) True
    Equals(value1, value2) False
    ReferenceEquals(value1,value2) False

    结合上面两个例子,我们定义一个long 变量, 一个unit 变量, 给它们赋值之后,再将这两个变量赋值给两个object 对象。

    static void Main(string[] args)
     {
          object value1 = new object();
          object value2 = new object();

    long lgval = 2;
          int ival = 2;
               
          value1 = lgval;
          value2 = ival;
     
          Console.WriteLine("lgval  == ival {0}", (lgval == ival).ToString());
          Console.WriteLine("value1  == value2 {0}", (value1 == value2).ToString());
          Console.WriteLine("value1.Equals(value2) {0}", value1.Equals(value2).ToString());
          Console.WriteLine("Equals(value1, value2) {0}", Equals(value1, value2).ToString());
          Console.WriteLine("ReferenceEquals(value1,value2) {0}", ReferenceEquals(value1,value2).ToString());

    }

    可以看到,除去值类型 lgval 和 uval 相等外,其它都是不相等的。

    lgval  == uval True
    value1  == value2 False
    value1.Equals(value2) False
    Equals(value1, value2) False
    ReferenceEquals(value1,value2) False

    是不是很抓狂? 到底什么情况下相等?什么情况下不等?我们先将上面的结果总结一下。

       

    value1 和value2都是Object 对象

    含有相同类型的值对象(int)

    含有相同的值

     

    value1 是long,value2 是 int

    含有相同的值

     

    value1 和value2都是Object 对象

    含有不同类型的值对象(long,int)

    含有相同的值

     
    value1 == value2   false    true     false  
    value1.Equals(value2)   true    true     false  
    Equals(value1, value2)    true   false     false  
    ReferenceEquals(value1,value2)    false   false     false  

    如果将一个值类型赋值给一个object 对象后,如何判断相等? 微软官方也没有给出一个标准的说法。从测试的角度来看。

    两个比较的 object 中的内容如果类型相同,可以使用Equals 来进行比较。

    上一篇:Java中对数组的声明与初始化

    栏    目:Ubuntu

    下一篇:使用Docker创建Web服务详解

    本文标题:C#相等判断实例报错分析及解决

    本文地址:http://www.jh-floor.com/fuwuqijiaocheng/Ubuntu/8676.html

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号