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 类型是个特例,因为他的内部对这两个都进行了重写。

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. 用scala的actor并发编程写一个单机版的WorldCount

    前言:最近一段时间比较忙,也是比较懒了吧,好长时间没写博客了,新的一年到来,给自己一个小目标,博客坚持写下去,分享一下这历程!废话不多说,开始正题咯(希望大家喜欢!) 首先这算是一个scala程序的入 ...

  2. A1009 Product of Polynomials (25)(25 分)

    A1009 Product of Polynomials (25)(25 分) This time, you are supposed to find A*B where A and B are tw ...

  3. Android开发——常见的内存泄漏以及解决方案(一)

    0. 前言   转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52333954 Android的内存泄漏是Android开发领域永恒的 ...

  4. AD管理中心

    (一).安装 Active Directory 管理中心 引用位置: http://technet.microsoft.com/zh-cn/library/dd560652(WS.10).aspx ( ...

  5. 网络安全巧设置 Win2008 R2 防火墙详解(1)

    针对一般中小企业型来说,如果希望对企业网络进行安全管理,不一定非得花高价钱购买专业的防火墙设置,直接借助操作系统本身自带的防火墙功能即可以满足一般企业的应用,今天我们就一起来探究一下Windows S ...

  6. 2、HTML基础总结 part-2

    1.表单一 <html> <body> <form> 姓名: <input type="text" name="name&quo ...

  7. leetcode 【 Best Time to Buy and Sell Stock II 】python 实现

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  8. leetcode 【 Search in Rotated Sorted Array II 】python 实现

    题目: 与上一道题几乎相同:不同之处在于array中允许有重复元素:但题目要求也简单了,只要返回true or false http://www.cnblogs.com/xbf9xbf/p/42545 ...

  9. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

  10. java面向对象之关键字,权限修饰符

    1.关键字:this,static,package,importthis:1.表示对当前对象的引用!2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特 ...