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和==的比较

一、值类型的比较

对于值类型来说  两者比较的都是”内容”是否相同,即 值 是否一样,下面的比较很显然此时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 类型是个特例,因为他的内部对这两个都进行了重写。

内容转载自https://www.cnblogs.com/vaevvaev/p/6913841.html

(转)C# 的 String.CompareTo、 Equals和==的比较的更多相关文章

  1. C# 的 String.CompareTo Equals和==的比较

    String.CompareTo 语法 public int CompareTo(    string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...

  2. 关于String的equals问题和StringBuilder问题

    今天弄了一下String和StringBuilder,遇到了一些问题. 老规矩上代码图片: 发现stringBuilder的equals方法有问题,看了一下源码,发现stringbuilder没有重写 ...

  3. Java String.compareTo()方法

    描述:java.lang.String.compareTo() 方法比较两个字符串的字典. 比较是基于字符串中的每个字符的Unicode值.此String对象表示的字符序列的 参数字符串表示的字符序列 ...

  4. Java String 的equals, == , hascode的区别

    1.equals 和 == ==在java中是比较引用的,即在内存中的地址.而String的equals()是比较字符串的内容 http://blog.csdn.net/barryhappy/arti ...

  5. String的equals()方法源码解析

    每个String对象在创建的时候都构造了一个char类型的final声明的不可替换数组,数组中的每一个元素即字符串对应的每一个字符如图: String的equals()在比较的时候会进行两步比较: 1 ...

  6. 「译」JVM是如何使用那些你从未听过的x86魔幻指令实现String.compareTo的

    原文https://jcdav.is/2016/09/01/How-the-JVM-compares-your-strings/ 魔幻的String.compareTo 我们之前可能已经见过Java的 ...

  7. Java基础之String中equals,声明方式,等大总结

    无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识 ...

  8. java:String使用equals和==比较的区别

    原文链接:http://www.cnblogs.com/tinyphp/p/3768214.html "=="操作符的作用 1.用于基本数据类型的比较 2.判断引用是否指向堆内存的 ...

  9. Java中String 的equals 和==详解

    一.Java中数据存储区域包括: 1.寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new ...

随机推荐

  1. linux远程方式,以及基础命令

    最近准备学习linux系统,购买了阿里巴巴的云服务器,系统为CentOS. 一.连接实例 1.使用管理终端. 这是阿里巴巴云服务器管理控制台,需要登录阿里巴巴,找到自己实例后,点击右侧远程连接即刻. ...

  2. EGIT

    https://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html

  3. JPush Flutter Plugin(Futter推送-极光推送)

    https://pub.flutter-io.cn/packages/jpush_flutter JPush's officially supported Flutter plugin (Androi ...

  4. ag 命令的帮助文档

    安装 the silver searcher 在各大平台上都可以从软件库直接安装.除了 Debian/Ubuntu 外,其他系统使用的包名都是一样的. MacOS: brew install the_ ...

  5. upc组队赛1 闪闪发光 【优先队列】

    闪闪发光 题目描述 一所位于云南昆明的中医药本科院校--云南中医学院. 因为报考某专业的人数骤减,正面临着停招的危机. 其中有九名少女想到一条妙计--成为偶像, 只要她们成为偶像,学校的名气便会增加, ...

  6. 颠倒的价牌|2013年蓝桥杯A组题解析第四题-fishers

    颠倒的价牌 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店. 其标价都是4位数字(即千元不等). 小李为了标价清晰.方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参 ...

  7. 【做题】UVA-12304——平面计算集合六合一

    可真是道恶心题-- 首先翻译一下6个任务: 给出一个三角形,求它的外界圆. 给出一个三角形,求它的内接圆. 给出一个圆和一个点,求过这个点的切线的倾斜角\(\alpha \in [0,180)\).( ...

  8. JMeter常用菜单以及设置

    如何清空View Results Tree 先选中目标view results tree,然后在菜单上选择Run-->Clear https://stackoverflow.com/questi ...

  9. office完全卸载

    第一步:先暂停office服务,再通过 控制面板--卸载程序  --卸载office应用 第二步:通过office_move(自己命名的工具)软件卸载  工具分享:https://pan.baidu. ...

  10. JavaScript获取星期几的几种方法

    星期几的4种JS代码写法,有需要的朋友可以参考一下   第一种写法 代码如下: var str = ""; var week = new Date().getDay(); if ( ...