标签:result 文化 运行 str 存在 异常 dex info double
一、“==”操作符;String.Equals;ReferenceEquals 方法
1、在编程中实际上我们只需要这两种比较,c#中类型也就这两种
(1)值类型的比较:一般我们就是判断两个值类型实例各自包含的值是否相等
(2)引用类型的比较:由于引用类型在内存中的分布有两部分,一个是引用类型的引用(存在于线程栈中),一个是引用类型的值(存在于托管堆);所以我们比较引用类型也就存在两种比较
默认情况下:值类型比较的是两个值是否相等(不装箱情况下),引用类型比较的是两个引用是否相等。
2、字符串比较思路
要判断2个字符串变量是否相等,最高效的方法是看它们是否指向相同的内存地址,可以使用RefernceEquals方法来比较。如果2个变量指向的是不同的内存地址,那么就需要逐字符的比较2个字符串的变量,才能确认它们是否相等。由于逐字比较会花费大量的时间,降低性能。所以.NET提供了String.Equals方法来优化比较过程该方法能自动地完成引用比较和值比较。
“==”操作符,它实际上在底层是调用Equals方法,这是完成比较的一种简捷方式。虽然Equals方法已经满足了大多数的比较的需要,但是此方法没有重载方法,不支持区分大小写,和考虑每个国家的文化因素
3、“==”操作符介绍
实例:
值类型的==比较:虽然i和j在栈上具有不同的内存空间,但是他们的代数值都为5;m和n类型被自动转换并比较代数值
int i=5, j = 5; Console.WriteLine(i==j);//值类型比较代数值 输出True int m = 6; 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虚方法。
int i = 5; int j = 5; Console.WriteLine(i.Equals(j));//值类型比较 输出True int m = 6; 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的静态方法,比较两对象的引用是否相等,值类型和引用类型都是一样。
int i = 5; int j = 5; Console.WriteLine(object.ReferenceEquals(i, j));//输出False,具有不同的内存空间 int m = 6; 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=string.CompareOrdinal(str1,str2);//返回负数-20。因为CompareOrdinal比较的是底层的Unicode值。A(U+0041)小于a(U+0061),所以第一个字符串小于第二个字符串。
字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。
标签:result 文化 运行 str 存在 异常 dex info double
原文地址:https://www.cnblogs.com/qtiger/p/9885046.html