`

C# 中==和Equal的区别

    博客分类:
  • C#
 
阅读更多
今天突然看到一种情况,颠覆了我对这比较使用方法的判断。

于是开始在网上找资料,但几乎都是Java的,好不容易找到一个C#的,写的感觉可没意思,所以自己就调查了一下。

需要注意的是:在Java中字符串比较特殊,声明字符串变量和new字符串对象是不一样的,这和C#是个很大的区别,大家需要注意,所以在这两个比较方法也就有了差别。

在Java中:

string str1="abc";

string str2=new string("abc");

这两种写法是不同的,虽然都是声明了一个对象,但是第二种是创建了一个str2对象,stack中存储的是地址,在heap中对应的值,但是第一种方法的值就直接放在了heap中,这是向一个以前做过Java的同事请教的。

再说C#

C#中string字符串也是引用类型,由于字符串使用比较频繁,所以它的一些常用的方法有的是经过处理的。

在C#中字符串不管你是声明还是new对象的方式,他们是一样的。这和Java是不同的。这两种比较对字符串来说,他们处理的结果是等效的,即他们比较的都是变量的值是否相同,但必须都是字符串类型。

StringBuilder strb = new StringBuilder("hello");
            string str1, str2;
            str1 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            str2 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            string str3 = "hello";
            string str4 = "hello";
            Console.WriteLine(str1.Equals(str2));
            Console.WriteLine(str1 == str2);
            Console.WriteLine(str3.Equals(str4));
            Console.WriteLine(str3 == str4);
            Console.WriteLine(str1.Equals(str3));
            Console.WriteLine(str1 == str3);

            Console.WriteLine(str1.Equals(strb.ToString()));
            Console.WriteLine(str1 == strb.ToString());
上述几种结果都是true,由此可见,上述结论正确。

再看非字符串的引用类型。

public class Friend
    {
        public string Name { get; set; }

        public string Sex { get; set; }

        public int Age { get; set; }
    }

 class Program
    {
        static void Main(string[] args)
        {

           Friend f1 = new Friend { Name = "zhangsan", Age = 20, Sex = "male" };
            Friend f2 = new Friend { Name = "zhangsan", Age = 20, Sex = "male" };
            Console.WriteLine(f1.Equals(f2));
            Console.WriteLine(f1 == f2);

        }

   }
上述结果返回都是False,所以,对于非字符串类型的引用类型,这两种符号比较的都是变量的引用,并不是值。

说到大家是不是觉的我在说废话,这些和我们平时想象的都一致,没必要写出来。我今天写出来不是因为上面,而是看到了下面的情况才让我去调查的,就是使用在匿名类型上时。

      
    var vClass1 = new { Name = "abc", Age = 20 };
            var vClass2 = new { Name = "abc", Age = 20 };
            var vClass3 = new { Name = "abd", Age = 21 };
            Console.WriteLine(vClass1.Equals(vClass2));           //true
            Console.WriteLine(vClass1.Equals(vClass3));          //false
            Console.WriteLine(vClass1 == vClass2);                  //false
            Console.WriteLine(vClass1 == vClass3);                  //false
为什么上面的结果和上一个Friend引用类型的结果不一样呢?

因为在匿名类型上,Equal()方法比较的是对象的状态,如果两个对象的所有的属性的值都相同,那么就返回ture(两个匿名类必须有相同的属性,不然没什么比较意义)。

==没有发生变化,它比较的还是对象的引用,所以返回结果都是false。

总结:对于字符串来说,两个比较的都是对象的值,并且是等效的;对于非字符串的其他引用类型(非匿名类型)两个比较的都是对象的引用,并且是等效的;对于匿名类型,Equal()方法比较的是类型的状态,如果两个类型的属性和值都相同,就返回true;==比较的是对象的引用。
分享到:
评论

相关推荐

    ==和equals的比较

    在 C# 编程语言中,`==` 和 `equals` 是两个常用的比较运算符,但它们之间有很大的区别。 堆和栈的区别 在理解 `==` 和 `equals` 之前,我们需要了解堆和栈的区别。堆是一种动态分配的内存区域,由程序员自己申请...

    C#中的 == 和equals()区别浅析

    在C#编程语言中,`==`运算符和`Equals()`方法是用来比较对象或值类型是否相等的两种常见方式,但它们之间存在着显著的区别。本文将深入探讨这两种比较方式的工作原理及其应用场景。 首先,`==`运算符是C#中的一个...

    c#调用matlab画图

    在IT行业中,C#是一种广泛使用的面向对象的编程语言,主要应用于Windows平台的软件开发,而MATLAB(MATrix LABoratory)则是一款强大的数学计算和数据分析环境,尤其擅长数值计算、符号计算以及数据可视化。当C#需要...

    C#对各种字符串的操作,及函数使用方法的实例

    在C#编程语言中,字符串是极为重要的数据类型,它们用于存储和处理文本信息。C#提供了丰富的内置函数和方法来操作字符串,如截取、替换、比较等,这些功能在实际开发中极为常见且实用。 ### 字符串长度:`Len` `...

    C#实验报告.doc

    ### C#实验报告知识点 #### 实验一:基础C#程序设计 **实验目标:** 1. **了解.NET ...以上实验内容不仅涵盖了C#语言的基础知识,还涉及到了面向对象编程的一些高级特性,有助于学生更好地理解和掌握C#语言。

    C#中的Nunit测试(内含第一个样例及关键说明)

    在C#编程中,NUnit是一个广泛使用的单元测试框架,它允许开发者编写可执行的测试用例来验证代码的功能和正确性。NUnit提供了一种结构化的、易于理解和执行的方式来测试代码,确保软件的可靠性和稳定性。下面我们将...

    C#面试笔试题目总结

    17. 在 c#中 using 和 new 这两个关键字有什么意义? new 创建实例,new 隐藏基类中方法,using 引入命名空间或者使用非托管资源。 18. 软件开发过程一般有几个阶段? 需求分析,架构设计,代码编写。 19. 请说明...

    C#实现多条件组合查询

    以下将详细介绍如何在C#中实现多条件组合查询,并提供相关的编程思路和技术要点。 首先,理解"多条件组合查询"的基本概念:它是指在一个查询中,同时基于两个或更多的条件进行筛选。例如,我们可能需要找出所有年龄...

    C#将Lambda表达式转成Sql语句

    在.NET框架中,C#是一种强大的编程语言,它支持Lambda表达式,这使得代码更加简洁、易读。Lambda表达式通常用于LINQ(Language Integrated Query)查询,它允许程序员使用类似SQL的语法在内存中的数据集上进行操作。...

    C#快速排序练习

    在C#中实现快速排序,可以创建一个`QuickSort`方法,接收一个整数数组和两个整数参数,分别代表要排序的子数组的起始和结束索引。这里是一个简单的C#实现示例: ```csharp public static void QuickSort(int[] ...

    C#实现移除字符串末尾指定字符的方法

    总结起来,C#中实现移除字符串末尾指定字符的方法主要涉及到字符串的`LastIndexOf`和`Substring`方法,通过这两个方法的组合,我们可以高效地完成字符串的处理,满足各种应用场景的需求。同时,单元测试对于确保代码...

    C# 分期付款算法(包涵等额本息和等额本金)

    在C#代码实现时,可以创建一个类`LoanCalculator`,包含两个静态方法`CalculateEqualInstallment`和`CalculateEqualPrincipal`分别对应等额本息和等额本金的计算。类内部可以封装上述逻辑,提供友好的接口供其他代码...

    c# 基础知识巩固

    本文将深入探讨C#基础知识中的关键概念,包括REF和OUT关键字以及类型推断。 首先,我们来讨论REF关键字。在C#中,REF关键字用于传递参数的引用,而不是值的副本。这意味着当在函数内部改变参数时,原始变量的值也会...

    C#中文件和目录相关操作 DirectoryInfo 类

    ### C#中文件和目录相关操作:DirectoryInfo 类与 FileInfo 类 在.NET Framework中,`DirectoryInfo` 和 `FileInfo` 类提供了丰富的API用于文件和目录的操作。这些类封装了文件系统对象(文件或目录),并提供了...

    C#字符串和正则表达式参考手册

    字符串处理和正则表达式是C#中两个非常关键的概念,它们在数据处理、文本分析和验证等方面发挥着重要作用。本参考手册旨在深入解析C#中的字符串操作与正则表达式使用,帮助你提升在这两个领域的专业技能。 ### C# ...

    C#计算器完整代码

    在C#编程中,开发一个计算器程序是一项基础但重要的练习,可以帮助初学者更好地理解面向对象编程的概念以及事件处理。在这个"C#计算器完整代码"中,我们看到的是一个基于Windows Forms的应用程序,它模拟了一个基本...

    C#语言规范-PDF文件

    根据给定的文件信息,以下是对C#语言规范的一些关键知识点的详细解释: ### C#语言规范概述 ...以上是对C#语言规范的部分内容的概述,通过深入学习这些基础概念和技术,程序员可以更好地理解和应用C#进行软件开发。

    c# 3.0语法规范

    C#中的字面量是指直接在源代码中表示的数据值,例如数字、字符串、字符等。 **字符串字面量示例:** ```csharp string name = "Alice"; ``` **整型字面量示例:** ```csharp int age = 25; ``` #### 14. 运算符和...

    operation 计算器 c#源码

    在C#编程语言中,创建一个操作计算器是一个基础但实用的练习,可以帮助开发者熟悉面向对象编程、事件处理和UI设计。下面将详细讲解这个“operation 计算器”项目涉及的关键知识点。 首先,C#是一种面向对象的语言,...

    C#字符串和正则表达式参考手册4

    在本篇内容中,我们将基于《C#字符串和正则表达式参考手册4》这一资料进行深入探讨,重点讲解如何在Visual Studio 2008环境中有效地使用C#中的字符串处理与正则表达式功能。这不仅对于初学者来说是一份宝贵的资源,...

Global site tag (gtag.js) - Google Analytics