zoukankan      html  css  js  c++  java
  • C# 的 String.CompareTo Equals和==的比较

    String.CompareTo 语法

    public int CompareTo(
        string strB
    )

    返回值

    • 小于 0,实例小于参数 strB;
    • 0,实例等于参数 strB;
    • 大于 0,实例大于参数 strB,或者 strB 是 null 引用。

    比较程序

    并不是按字符串长度来比较的,而是:

    • 比较两个字符串的第一个字符:相等则比较第二个,不相等则直接返回结果;
    • 比较两个字符串的第二个字符:相等则比较第三个,不相等则直接返回结果;
    • 比较两个字符串的第三个字符:相等则比较第四个,不相等则直接返回结果;
    • ……

    谁大谁小?

    实例大还是 strB 大,这是受计算机区域设置影响的,对于我们的中国区域设置,默认为:

    null<零长度字符串<0<1<2<...<9<a<b<c<...<z<...<阿<...<不<...<吃<...<这<...

    需要说明数字、字母也是拆开一个一个的比较的,比如:字符串 "200" 是小于 "3" 的,因为 "2" 小于 "3"。

    string a = "阿";
    string b = "不";
    string c = "吃";
     
    if (a.CompareTo(b) > 0)
    {
        Response.Write(a + "&gt;" + b + "<br>");
    }
    else if (a.CompareTo(b) < 0)
    {
        Response.Write(a + "&lt;" + b + "<br>");
    }
     
    if (b.CompareTo(c) > 0)
    {
        Response.Write(b + "&gt;" + c + "<br>");
    }
    else if (b.CompareTo(c) < 0)
    {
        Response.Write(b + "&lt;" + c + "<br>");
    }

    结果为:

    阿<不
    不<吃

    改一下区域设置

    在“控制面板”中,打开“区域和语言选项”,在“区域选项”中单击“自定义”,在“排序”标签中选择“笔划”,一路确定。然后关闭 Visual Web Developer(假设我们是在 VWD 中进行的实验),再打开之,运行网站。

    排序变成了:

    阿>不
    不<吃

    因为这是按笔划来的(“不”在这里笔划最少),不再是按拼音来的。我们改的这个区域设置只影响了中文,没有影响到数字和字母等。

    所以

    所以 CompareTo 很少用,不要用 CompareTo 来比较两个字符串是否相等,要用 Equals。

    ======================================================================================================================

    Equals和==的比较

     一、值类型的比较

      对于值类型来说  两者比较的都是内容”是否相同,即 值 是否一样,很显然此时两者是划等号的。

                int i = 9;
                int j = 9;
                Console.WriteLine("i==j"+(i==j)); //true
                Console.WriteLine("i.Equals(j)"+(i.Equals(j)));  //true

      二、引用类型的比较

      对于引用类型来说,等号(==)比较的是两个变量的引用 是否一样,即是引用的”地址是否相同。而对于equals来说仍然比较的是变量的  内容 是否一样。

      1、字符串的比较

                string s1 = "abc";
                string s2 = "abc";
                Console.WriteLine("s1==s2"+(s1==s2));//true
                Console.WriteLine("s1.Equals(s2)"+(s1.Equals(s2)));//true

      string是微软封装的一个字符串类,在内部他已经对 = = 操作符进行了重写。重写后他比较的则是两个变量的内容是否相同,重写后的 = = 操作符内部调用的即是 equals 方法,所以输出的是true

      2、 自定义的其他引用类型——一 person类为例

                Person p1 = new Person("aa",18);
                Person p2 = new Person("aa",18);
                Console.WriteLine("p1==p2"+(p1==p2));//false
                Console.WriteLine("p1.Equals(p2)"+p1.Equals(p2));//false

      对于 p1==p2 比较的结果是false,这点是毫无疑问的,因为他俩是两个不同的变量,所以引用的地址也是不同的。但是对于p1.Equals(p2) 返回false,可能有人会产生疑问,p1 和p2的内容是相同的啊,为什么他俩的比较结果却是为false呢?。原因就在于在Equals是Object中的一个虚方法,而person类中没有对她进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false。要想让他能够比较两个变量的内容是否相同,那就应该重写Equals方法

    public override bool Equals(object obj)
            {
                Person p = (Person)obj;
                return (this.Name == p.Name) && (this.Age == p.Age);
            }

      总结:Equals比较的永远是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,否则输出可能会有不同)。string 类型是个特例,因为他的内部对这两个都进行了重写。

     

  • 相关阅读:
    韩日网民爆发网络大战 互相攻瘫服务器 狼人:
    2010年RSA大会RSA总裁主题演讲:云的安全 狼人:
    黑客非法下载4千万条学历数据被判刑 狼人:
    黑客称Windows 7比Linux安全 Flash是威胁 狼人:
    方法代码Scala中的语言特性是如何实现的(2)
    参考知识svideo vs. composite video vs. component video 几种视频格式详细说明和比较
    旋转长度左旋转字符串(26)
    设置参数cocos2dx 2.x 进度条CCProgressTimer
    队列输入队列基本操作
    安装华硕华硕电脑K52JU安装银联控件蓝屏
  • 原文地址:https://www.cnblogs.com/vaevvaev/p/6913841.html
Copyright © 2011-2022 走看看