c#引用相等性比较(ReferenceEquals)
Object.ReferenceEquals方法原型
public static bool ReferenceEquals(
object objA,
object objB
)
namespace TestReferenceEquality
{
struct TestStruct
{
public int Num { get; private set; }
public string Name { get; private set; } public TestStruct(int i, string s) : this()
{
Num = i;
Name = s;
}
} class TestClass
{
public int Num { get; set; }
public string Name { get; set; }
} class Program
{
static void Main()
{
//测试对象相等性
#region ReferenceTypes // 创建具有两个相同值的引用实例。 TestClass tcA = new TestClass() { Num = , Name = "New TestClass" };
TestClass tcB = new TestClass() { Num = , Name = "New TestClass" }; Console.WriteLine("ReferenceEquals(tcA, tcB) = {0}",
Object.ReferenceEquals(tcA, tcB)); // false // 赋值后, 引用同一对象
tcB = tcA;
Console.WriteLine("After asignment: ReferenceEquals(tcA, tcB) = {0}",
Object.ReferenceEquals(tcA, tcB)); // true
#endregion // 演示两个值类型实例从不具有引用相等性。
#region ValueTypes TestStruct tsC = new TestStruct( , "TestStruct 1");
//虽是拷贝,具有相同的值,但却不是同一对象,涉及装箱
TestStruct tsD = tsC;
Console.WriteLine("After asignment: ReferenceEquals(tsC, tsD) = {0}",
Object.ReferenceEquals(tsC, tsD)); // false
#endregion #region stringRefEquality
//"Hello world!";常量字符串在内存中只有一份,所以两者指向同一内存
string strA = "Hello world!";
string strB = "Hello world!";
Console.WriteLine("ReferenceEquals(strA, strB) = {0}",
Object.ReferenceEquals(strA, strB)); // true // 改变引用用后,两者不再相等
strA = "Goodbye world!";
Console.WriteLine("strA = \"{0}\" strB = \"{1}\"", strA, strB); Console.WriteLine("After strA changes, ReferenceEquals(strA, strB) = {0}",
Object.ReferenceEquals(strA, strB)); // false //string对象在运行期间被创建,跟strB是完全不同的两个对象,在用 Object.ReferenceEquals判断引用相等时则返回false
StringBuilder sb = new StringBuilder("Hello world!");
string stringC = sb.ToString();
// False:
Console.WriteLine("ReferenceEquals(stringC, strB) = {0}",
Object.ReferenceEquals(stringC, strB)); // 字符串类重载了==运算符来执行相等比较
Console.WriteLine("stringC == strB = {0}", stringC == strB); // true
#endregion
}
}
}
对于值类型的采用ReferenceEquals将返回false,引用类型采用ReferenceEquals比较时,若是引用同一实例则返回true,
判断字符串内容是否相等可直接利用字符串类的重载运算符==来判断
为了最大程度地减小出现错误的可能性,最好在必须确定两个对象是否具有引用相等性时使用 ReferenceEquals。
c#引用相等性比较(ReferenceEquals)的更多相关文章
- 改善C#程序的50种方法
为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好.我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力.如果固守旧有的习惯,我们将得不到期望的结果.对于C ...
- Java代码到字节码——第一部分
Java代码到字节码——第一部分 原文地址 作者:James Bloom 译者:张坤 理解在Java虚拟机中Java代码如何别被编译成字节码并执行是非常重要的,因为这可以帮助你理解你的程序在运行时发生 ...
- Angular - - $rootScope.Scope
这里讲的是一些scope的操作,如创建/注销/各种监听及scope间的通信等等. $rootScope.Scope 可以使用$injector通过$rootScope关键字检索的一个根作用域. 可以通 ...
- C# string 字符串详解 恒定 驻留
string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨.这篇文章共四节,来讲 ...
- C#-派生类
VS派生类 继承.派生类 class AClass : FClass 构建函数继承 public classname (string astring): base(astring){};默认不继承基类 ...
- C# string 特殊的引用类型
.Net 框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,也就是说线程上的堆栈上不会驻留有任何字符串.(译注:注意这里的“直接继承”.直接继承 ...
- C#中特殊的string类型
string C#有string关键字,在翻 ...
- 字符串的驻留(String Interning)
http://www.cnblogs.com/artech/archive/2007/03/04/663728.html 关于字符串的驻留的机制,对于那些了解它的人肯定会认为很简单,但是我相信会有很大 ...
- IEditableObject的一个通用实现
原文:IEditableObject的一个通用实现 IeditableObject是一个通用接口,用于支持对象编辑.当我们在界面上选择一个条目,然后对其进行编辑的时候,接下来会有两种操作,一个是保持编 ...
- string 驻留机制
string 驻留机制 string s1 = "abc"; string s2 = "ab"; string s3 = s2 + "c" ...
随机推荐
- php实现数值的整数次方
php实现数值的整数次方 一.总结 没有考虑到指数为负数的情况 二.php实现数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exp ...
- Node.js v10.1.0 Documentation
Modules Stable 在 Node.js 模块系统中,每个文件都会被当做一个独立的模块.假设有一个名为 foo.js: const circle = require('./circle.js' ...
- sed学习总结
sed学习总结 sed工作流 测试文件:cat employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysad ...
- [Angular] Configurable NgModules
You probably have seen 'foorRoot()' method a lot inside Angular application. Creating a configurable ...
- [Angular] Test Container component with async provider
The main idea for testing contianer component is to make sure it setup everythings correctlly. Call ...
- android安卓开发基础小笔记,添加按钮事件,打开新窗体,窗体传值,回传
给一个按钮添加onclick事件 //获取按钮对象 Button Aiyo = (Button)findViewById(R.id.button1); Aiyo.setOnClickListener( ...
- 号外:小雷将开发一款Java版的简易CMS系统
我的个人官网: http://FansUnion.cn 已经改版,隆重上线了,欢迎关注~持续升级中... 出于个人兴趣.技术总结.工作相关,我终于想要做一个简单的CMS系统了. 原来想研究,D ...
- 【转】A* A星 算法 C语言 实现代码
http://blog.csdn.net/shanshanpt/article/details/8977512 关于A*算法,很早就想写点什么,可是貌似天天在忙活着什么,可事实又没有做什么,真是浮躁啊 ...
- Ajax基础与Json应用(二)
九.jQuery 实现Ajax应用 1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url, ...
- Android-通过Java代码来实现属性动画
Android-通过Java代码来实现属性动画 除了能够使用定义xml文件来设置动画之外.还能够使用java代码来进行控制动画. 示比例如以下: 布局文件: <RelativeLayout xm ...