一、“==”操作符;String.Equals;ReferenceEquals 方法

  1、在编程中实际上我们只需要这两种比较,c#中类型也就这两种

  (1)值类型的比较:一般我们就是判断两个值类型实例各自包含的值是否相等

  (2)引用类型的比较:由于引用类型在内存中的分布有两部分,一个是引用类型的引用(存在于线程栈中),一个是引用类型的值(存在于托管堆);所以我们比较引用类型也就存在两种比较

默认情况下:值类型比较的是两个值是否相等(不装箱情况下),引用类型比较的是两个引用是否相等。

  2、字符串比较思路

  要判断2个字符串变量是否相等,最高效的方法是看它们是否指向相同的内存地址,可以使用RefernceEquals方法来比较。如果2个变量指向的是不同的内存地址,那么就需要逐字符的比较2个字符串的变量,才能确认它们是否相等。由于逐字比较会花费大量的时间,降低性能。所以.NET提供了String.Equals方法来优化比较过程该方法能自动地完成引用比较和值比较。

  “==”操作符,它实际上在底层是调用Equals方法,这是完成比较的一种简捷方式。虽然Equals方法已经满足了大多数的比较的需要,但是此方法没有重载方法,不支持区分大小写,和考虑每个国家的文化因素

  3、“==”操作符介绍

  • 对于值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false
  • 对于引用类型,则==一般情况下比较的这是引用类型的引用是否相等。(对于引用类型最好不要使用==符号进行相等性比较,避免混淆,因为string是经常需要操作,所以某些内置的引用类型重载了==符号,例如string就重载==,使其比较的不是两个字符串的引用,而是比较的两个字符串字面量是否相等。)

  实例:

  值类型的==比较:虽然i和j在栈上具有不同的内存空间,但是他们的代数值都为5;m和n类型被自动转换并比较代数值

, j = ;
Console.WriteLine(i==j);//值类型比较代数值 输出True

;
double n = 6.0;
Console.WriteLine(m == n);//类型自动转换并比较数值 输出True

  引用类型==比较:如下代码,两个object对象都在堆上申请了空间,在线程栈上存在两个不同的引用,所以输出结果为False

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2==obj1);//引用类型比较引用 输出False

  4、Equals 介绍

  定义:Equals属于Object的实例方法,用于比较两个对象的引用是否相等,注意:对于Object对象比较的是引用!然而对于值类型,类型相同(不会进行类型自动转换),并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。这是因为内置的值类型都重写了Object.Equals方法,所以值类型的Equals方法与引用类型的Equals就产生了不同的效果。

  实例

  Equals在程序运行时决定比较的类型--根据对象的实际类型进行比较,根据对象的类型调用他们各自的Equals虚方法。

;
;
 Console.WriteLine(i.Equals(j));//值类型比较 输出True

;
double n = 6.0;
Console.WriteLine(m.Equals(n));//类型不会自动转换并比较数值 输出False

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj2.Equals(obj1));//引用类型比较 输出False
Console.WriteLine(obj2.Equals(string.Empty));//输出False,比较量对象的类型不同直接返回False    

  5、ReferenceEquals 介绍

  定义:Object的静态方法,比较两对象的引用是否相等,值类型和引用类型都是一样。

;
;
Console.WriteLine(object.ReferenceEquals(i, j));//输出False,具有不同的内存空间

;
double n = 6.0;
Console.WriteLine(object.ReferenceEquals(m, n));//输出False,具有不同的内存空间

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出False,具有不同的内存空间

  6、ReferenceEquals;==;Equals异同

  (1)ReferenceEquals比较对象的引用是否相同,而且是安全的比较

  (2)==;Equals异同

    相同点: 对于值类型 都是比较代数值是否相等

    不同点:(1)对于值类型比较,==会进行类型的自动转换,然后比较代数值,Equals则不会进行转换,先比较类型,再比较值,如果类型不同直接返回false
          (2)==比较是安全的比较,也就是说两对象为任何值都可以进行比较,不会抛出异常;而Equals的比较则是不安全的,由于在Equals在运行时才会进行真正的比较,有可能调用Equals的调用者是NULL,编译通过,但是运行时则会抛出异常(所以对于引用类型是要使用实例的Equals进行比较时,一定不要忘记检查调用者对象是否为空。)

二、String.Compare是一个比较灵活的比较方法,由于考虑到大小写或文化因素,就可以使用此方法。因为它有许多重载的形式,可以接受大小写或文化的参数,也支持子串比较。

  语法如下:

  int Compare(string str1,string str2);//指定要比较的字符串;

Compare(string str1,string str2,bool IgnoreCase);//bool IgnoreCase默认为false,如果是true,则不区分大小写的比较。

Compare(string str1,string str2,bool IgnoreCase,CulureInfo ci);//CulureInfo ci,要使用的文化。

Compare(string str1,int index1,string str2,int index2,int len);//index1和index2分别表示str1和str2的起始位置。

  Compare返回一个表示比较结果的整数值,两个字符相同,则返回0;如果第一个字符串小宇第二个字符串,则返回小于0;如果第一个字符串大于第二字符串,返回值大于0;

int result;

string str1="ABC";

string str2="abc";

result=string.Compare(str1,str2);//返回1,因为A比a大;

result=string.Compare(str1.str2,false);//返回1,区分大小写;

result=string.Compare(str1,str2,ture);//返回0,不区分大小写;

  在编写程序是,要考虑的文化因素影响。.NET给各种文化的分别提供了一组准则,在执行Compare方法时,CLR会检查相关文化,并使用相对应的准则。Compare方法提供了一个CultureInfo对象参数。

CultureInfo ci = new CultureInfo("cs-cz");

要明确的指定一个默认文化或者无文化信息,CultureInfo类提供了2个成员属性,CurrentCulture(当前线程相关文化)和InvariantCulure(忽略文化因素),可以作为参数传递给方法。这样使得程序具有自描性,可以清楚的这些方法是否受到文化的影响。

三、String.CompareOrdinal是对严格基于字符的序数值完成比较。它其实是使用一种简单的算法来比较2个字符串的Unicode值。如果第一个字符串小于第二个字符串,则返回小于0;如果是2个字符串相等,返回0;如果第一个字符串大于第二字符串,则返回大于0的值。

string str1=“Abc”;

string str2=“abc”;

result=string.Compare(str1,str2,false,CultureInfo.InvariantCulture);//返回1,A比a大,不受文化影响。
result=。因为CompareOrdinal比较的是底层的Unicode值。A(U+)小于a(U+),所以第一个字符串小于第二个字符串。

C#基础知识之字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。的更多相关文章

  1. java 基础知识六 字符串1

    java  基础知识六  字符串1 String 不是java的基本数据类型 String 不是java的基本数据类型 String 不是java的基本数据类型 字符串是是一个字符序列 1.创建 创建 ...

  2. C# 篇基础知识7——字符串

    文字是信息的主要表达方式,因此文字处理是计算机的一项重要功能之一.现在来深入研究C#中字符串的各种特性.正则表达式的基本概念以及如何用正则表达式进行文本匹配. 1.char结构 C#中的字符用Syst ...

  3. JavaScript基础知识(字符串的方法)

    字符串的方法 1.字符串: 在js中被单引号或双引号包起来的内容都是字符串: var t = "true"; console.log(typeof t);// "stri ...

  4. swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)

    xcode 中调用API帮助 1.查看简单信息,选中后 按键 control +左键单击  或者按 右侧属性栏 里的帮助按钮 2.完整API,选中后 按键 control +左键双击 3.查看类.函数 ...

  5. python基础知识(字符串)

    定义字符串 ' '单引号 " "双引号  只能用于单行 '" '"三引号  可以用于多行 拼接字符串使用  +号链接 字符串只能链接字符串其他类型字符串需要用s ...

  6. java 基础知识六 字符串2

    java  基础知识六  字符串2 1.String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法 . String 是不可变对象,也就是一旦创建,那么整 ...

  7. Python3基础知识之字符串

    1.运算符 * >>> b=a*5>>> b'pythonpythonpythonpythonpython'>>> b.replace('t',' ...

  8. Python基础知识之字符串操作方法总结

    Python 中字符串也是一种数据类型,针对此数据总结下常用的方法 1,字符串截取,变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾 ...

  9. java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度

    package tek; Java算法——求出两个字符串的最长公共字符串 /** * @Title: 问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. * @author 匹夫( ...

随机推荐

  1. 浅谈新的布局方式-flex

    引言: 网页布局在flex出来之前,是由盒模型为底子,float,position,table,百分比来进行布局的,重绘的比较多,影响性能,复杂又不好维护.flex布局,可以简便.完整.响应式地实现各 ...

  2. 记录阿里云服务器mysql被黑

    前言 比上次服务器被黑还要恐怖的数据库被黑,再次强调,数据库不备份不做安全,你就可以准备跑路了. 这次记录一下整个被黑的过程,以及整个检查和处理的过程. 发现 上个月某一天,网站出现了无法登录的情况, ...

  3. 阿里云Ubuntu安装图形界面与中文语言包

    图形界面: http://blog.csdn.net/qq_37608398/article/details/78155568?locationNum=9&fps=1 安装中文: http:/ ...

  4. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...

  5. Spring Cloud Alibaba基础教程:使用Nacos作为配置中心

    通过本教程的前两篇: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方 ...

  6. Unlink——2016 ZCTF note2解析

    简介 Unlink是经典的堆漏洞,刚看到这个漏洞不知道如何实现任意代码执行,所以找了一个CTF题,发现还有一些细节的地方没有讲的很清楚,题目在这里.自己也动手写一遍,体验一下 题目描述 首先,我们先分 ...

  7. 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad

    目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 ...

  8. .Net语言 APP开发平台——Smobiler学习日志:如何快速实现Timer计时功能

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...

  9. [MySQL] 测试where group by order by的索引问题

    1. select * from test  where a=xx group by b order by c   如何加索引 CREATE TABLE `index_test` ( `id` int ...

  10. Windows中nvm使用

    介绍:在两个项目且使用的node版本不一样时,维护多个版本的node, 安装:下载安装目录:https://github.com/coreybutler/nvm-windows/releasesnvm ...