今天突然看到一种情况,颠覆了我对这比较使用方法的判断。
于是开始在网上找资料,但几乎都是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是不同的。这两种比较对字符串来说,他们处理的结果是等效的,即他们比较的都是变量的值是否相同,但必须都是字符串类型。
再看非字符串的引用类型。
说到大家是不是觉的我在说废话,这些和我们平时想象的都一致,没必要写出来。我今天写出来不是因为上面,而是看到了下面的情况才让我去调查的,就是使用在匿名类型上时。
因为在匿名类型上,Equal()方法比较的是对象的状态,如果两个对象的所有的属性的值都相同,那么就返回ture(两个匿名类必须有相同的属性,不然没什么比较意义)。
==没有发生变化,它比较的还是对象的引用,所以返回结果都是false。
总结:对于字符串来说,两个比较的都是对象的值,并且是等效的;对于非字符串的其他引用类型(非匿名类型)两个比较的都是对象的引用,并且是等效的;对于匿名类型,Equal()方法比较的是类型的状态,如果两个类型的属性和值都相同,就返回true;==比较的是对象的引用。
于是开始在网上找资料,但几乎都是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;==比较的是对象的引用。
发表评论
-
C# 实现将文件夹分卷压缩
2015-04-17 17:01 1240http://bbs.csdn.net/topics/3907 ... -
C#发送邮件
2015-04-17 15:58 694public class SendEmailHelper ... -
C# xml文件读取
2015-02-11 16:08 640看附件................ -
什么时候该用委托,为什么要用委托,委托有什么好处....
2015-01-29 16:56 815http://www.cnblogs.com/superpce ... -
C#中动态加载和卸载DLL
2015-01-26 14:02 1420在C++中加载和卸载DLL是一件很容易的事,LoadLibra ... -
转:c#常用的18种设计模式
2015-01-21 08:16 768http://blog.jobbole.com/78130/ -
C#委托的介绍(delegate、Action、Func、predicate)
2015-01-09 17:26 1116http://www.cnblogs.com/akwwl/p/ ... -
接口和抽象类有什么区别 .
2014-12-22 16:35 614接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
C#一个简单写日志文件的类
2014-12-11 09:57 1108/// <summary> /// L ... -
Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)
2014-12-10 14:34 355http://www.cnblogs.com/huangcon ... -
C#泛型详解
2014-11-29 11:31 481我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处 ... -
线程同步与异步的区别
2014-11-26 09:12 877异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立 ... -
应用C#和SQLCLR编写SQL Server用户定义函数 .
2013-10-09 17:07 482http://blog.csdn.net/zhzuo/arti ... -
log4Net简介
2013-06-30 11:32 574使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中 ... -
DataGridView历史记录的前进与后退操作
2013-06-23 11:13 1107此功能介绍:DataGridView频繁查询数据时,可以将每次 ... -
c# 对INI配置文件的读取操作
2013-06-17 10:51 677此种方法只对如下格式的INI文件起作用 server=loca ... -
对DataGridView控件的扩展开发
2013-06-15 21:47 2376首先在项目中引用 ... -
对集合控件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查找、替换操作控件
2013-06-15 09:39 1544一、程序入口: using System; using ... -
C#对文件、文件夹操作公用组件
2013-06-11 09:46 967namespace HR.Class.IO { / ... -
TreeView控件操作开发篇之(五)
2013-06-09 00:09 824#region 加载文件夹及文件到树 ...
相关推荐
在 C# 编程语言中,`==` 和 `equals` 是两个常用的比较运算符,但它们之间有很大的区别。 堆和栈的区别 在理解 `==` 和 `equals` 之前,我们需要了解堆和栈的区别。堆是一种动态分配的内存区域,由程序员自己申请...
在C#编程语言中,`==`运算符和`Equals()`方法是用来比较对象或值类型是否相等的两种常见方式,但它们之间存在着显著的区别。本文将深入探讨这两种比较方式的工作原理及其应用场景。 首先,`==`运算符是C#中的一个...
在IT行业中,C#是一种广泛使用的面向对象的编程语言,主要应用于Windows平台的软件开发,而MATLAB(MATrix LABoratory)则是一款强大的数学计算和数据分析环境,尤其擅长数值计算、符号计算以及数据可视化。当C#需要...
在C#编程语言中,字符串是极为重要的数据类型,它们用于存储和处理文本信息。C#提供了丰富的内置函数和方法来操作字符串,如截取、替换、比较等,这些功能在实际开发中极为常见且实用。 ### 字符串长度:`Len` `...
### C#实验报告知识点 #### 实验一:基础C#程序设计 **实验目标:** 1. **了解.NET ...以上实验内容不仅涵盖了C#语言的基础知识,还涉及到了面向对象编程的一些高级特性,有助于学生更好地理解和掌握C#语言。
在C#编程中,NUnit是一个广泛使用的单元测试框架,它允许开发者编写可执行的测试用例来验证代码的功能和正确性。NUnit提供了一种结构化的、易于理解和执行的方式来测试代码,确保软件的可靠性和稳定性。下面我们将...
17. 在 c#中 using 和 new 这两个关键字有什么意义? new 创建实例,new 隐藏基类中方法,using 引入命名空间或者使用非托管资源。 18. 软件开发过程一般有几个阶段? 需求分析,架构设计,代码编写。 19. 请说明...
以下将详细介绍如何在C#中实现多条件组合查询,并提供相关的编程思路和技术要点。 首先,理解"多条件组合查询"的基本概念:它是指在一个查询中,同时基于两个或更多的条件进行筛选。例如,我们可能需要找出所有年龄...
在.NET框架中,C#是一种强大的编程语言,它支持Lambda表达式,这使得代码更加简洁、易读。Lambda表达式通常用于LINQ(Language Integrated Query)查询,它允许程序员使用类似SQL的语法在内存中的数据集上进行操作。...
在C#中实现快速排序,可以创建一个`QuickSort`方法,接收一个整数数组和两个整数参数,分别代表要排序的子数组的起始和结束索引。这里是一个简单的C#实现示例: ```csharp public static void QuickSort(int[] ...
总结起来,C#中实现移除字符串末尾指定字符的方法主要涉及到字符串的`LastIndexOf`和`Substring`方法,通过这两个方法的组合,我们可以高效地完成字符串的处理,满足各种应用场景的需求。同时,单元测试对于确保代码...
在C#代码实现时,可以创建一个类`LoanCalculator`,包含两个静态方法`CalculateEqualInstallment`和`CalculateEqualPrincipal`分别对应等额本息和等额本金的计算。类内部可以封装上述逻辑,提供友好的接口供其他代码...
本文将深入探讨C#基础知识中的关键概念,包括REF和OUT关键字以及类型推断。 首先,我们来讨论REF关键字。在C#中,REF关键字用于传递参数的引用,而不是值的副本。这意味着当在函数内部改变参数时,原始变量的值也会...
### C#中文件和目录相关操作:DirectoryInfo 类与 FileInfo 类 在.NET Framework中,`DirectoryInfo` 和 `FileInfo` 类提供了丰富的API用于文件和目录的操作。这些类封装了文件系统对象(文件或目录),并提供了...
字符串处理和正则表达式是C#中两个非常关键的概念,它们在数据处理、文本分析和验证等方面发挥着重要作用。本参考手册旨在深入解析C#中的字符串操作与正则表达式使用,帮助你提升在这两个领域的专业技能。 ### C# ...
在C#编程中,开发一个计算器程序是一项基础但重要的练习,可以帮助初学者更好地理解面向对象编程的概念以及事件处理。在这个"C#计算器完整代码"中,我们看到的是一个基于Windows Forms的应用程序,它模拟了一个基本...
根据给定的文件信息,以下是对C#语言规范的一些关键知识点的详细解释: ### C#语言规范概述 ...以上是对C#语言规范的部分内容的概述,通过深入学习这些基础概念和技术,程序员可以更好地理解和应用C#进行软件开发。
C#中的字面量是指直接在源代码中表示的数据值,例如数字、字符串、字符等。 **字符串字面量示例:** ```csharp string name = "Alice"; ``` **整型字面量示例:** ```csharp int age = 25; ``` #### 14. 运算符和...
在C#编程语言中,创建一个操作计算器是一个基础但实用的练习,可以帮助开发者熟悉面向对象编程、事件处理和UI设计。下面将详细讲解这个“operation 计算器”项目涉及的关键知识点。 首先,C#是一种面向对象的语言,...
在本篇内容中,我们将基于《C#字符串和正则表达式参考手册4》这一资料进行深入探讨,重点讲解如何在Visual Studio 2008环境中有效地使用C#中的字符串处理与正则表达式功能。这不仅对于初学者来说是一份宝贵的资源,...