C#.Net一百零一夜(第一夜)
来源:互联网 发布:椰族部落永久域名新址 编辑:程序博客网 时间:2024/04/30 12:26
一千零一夜的童话,使得童年的我,朦胧的开始了解世界,我也希望我的系列能够让初次踏上.Net这片沃土的您,能够有个坚强的臂膀,就如同您在知识海洋中遨游的那片孤舟,您无须知道您从那里出发,也无须知道您将向何而去,您只知道有这么一个日子,知识的彼岸将被您踏在脚下!
第一夜:
目的:字符串相等的比较。
陷阱:==运算符与Equal方法s的调用的结果大多情况是相同的,但也只是大多的情况而已。
下面是我通过Reflector反编译类库查看到的,String类对==与!=都进行了重载。
如下代码分为2个部分。
试验1:
让我们看下一个试验!
试验2:让我们看一下它们在内存中的位置!
输出结果:
看了结果客官您应该很清楚了吧!
strA和strB根本就是指向同一个内存块!所以在使用Ojbect==的时候,直接判断引用相同,返回True。
而strC和strD,在使用Ojbect==的时候,因为比较的类型是object,无法使用已重载String==,然后又引用不相同,所而返回的是False。
而至于为什么相同的String会造成引用的不同,呵呵,那就是另外一篇新随笔了。
我个人推荐是:对于几乎所有引用类型,当您希望判断对象性能相等性而不是对象引用一致性时,请使用 Equals,当然String这个特殊的引用类型除外,对字符串使用==增加了代码的可读性(至少我觉得比较清爽^.^,但请切记运算符两段就必须是String类型的表达式!
结论:为了钱包着想,小心使得万年船!
http://hatita.cnblogs.com/archive/2006/01/22/321526.html
第一夜:
目的:字符串相等的比较。
陷阱:==运算符与Equal方法s的调用的结果大多情况是相同的,但也只是大多的情况而已。
下面是我通过Reflector反编译类库查看到的,String类对==与!=都进行了重载。
public static bool operator ==(string a, string b)
{
return string.Equals(a, b);
}
public static bool operator !=(string a, string b)
{
return !string.Equals(a, b);
}
当比较对象的2个类型都是String时,它们是没有区别的。那么我们再做个试验。{
return string.Equals(a, b);
}
public static bool operator !=(string a, string b)
{
return !string.Equals(a, b);
}
如下代码分为2个部分。
试验1:
static void Main(string[] args)
{
string strA = "hatita";
string strB = "hatita";
Console.WriteLine(strA == strB);
Console.WriteLine(strA.Equals(strB));
object objA = strA;
object objB = strB;
Console.WriteLine(objA == objB);
Console.WriteLine(objA.Equals(objB));
Console.WriteLine("***************************************************")
string strC = new string(new char[] {'h','a','t','i','t','a'});
string strD = new string(new char[] {'h','a','t','i','t','a'});
Console.WriteLine (strC==strD);
Console.WriteLine (strD.Equals(strD));
object objC = strC;
object objD = strD;
Console.WriteLine (objC==objD);
Console.WriteLine (objC.Equals(objD));
}
{
string strA = "hatita";
string strB = "hatita";
Console.WriteLine(strA == strB);
Console.WriteLine(strA.Equals(strB));
object objA = strA;
object objB = strB;
Console.WriteLine(objA == objB);
Console.WriteLine(objA.Equals(objB));
Console.WriteLine("***************************************************")
string strC = new string(new char[] {'h','a','t','i','t','a'});
string strD = new string(new char[] {'h','a','t','i','t','a'});
Console.WriteLine (strC==strD);
Console.WriteLine (strD.Equals(strD));
object objC = strC;
object objD = strD;
Console.WriteLine (objC==objD);
Console.WriteLine (objC.Equals(objD));
}
输出结果:
让我们看下一个试验!
试验2:让我们看一下它们在内存中的位置!
unsafe static void Main(string[] args)
{
string strA = "hatita";
string strB = "hatita";
string strC = new string(new char[] {'h','a','t','i','t','a'});
string strD = new string(new char[] {'h','a','t','i','t','a'});
fixed(char* cPoint1 = strA)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
fixed(char* cPoint1 = strB)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
Console.WriteLine("***************************************************");
fixed(char* cPoint1 = strC)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
fixed(char* cPoint1 = strD)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
}
{
string strA = "hatita";
string strB = "hatita";
string strC = new string(new char[] {'h','a','t','i','t','a'});
string strD = new string(new char[] {'h','a','t','i','t','a'});
fixed(char* cPoint1 = strA)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
fixed(char* cPoint1 = strB)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
Console.WriteLine("***************************************************");
fixed(char* cPoint1 = strC)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
fixed(char* cPoint1 = strD)
{
IntPtr i = (IntPtr)cPoint1;
Console.WriteLine(i.ToInt32());
}
}
输出结果:
看了结果客官您应该很清楚了吧!
strA和strB根本就是指向同一个内存块!所以在使用Ojbect==的时候,直接判断引用相同,返回True。
而strC和strD,在使用Ojbect==的时候,因为比较的类型是object,无法使用已重载String==,然后又引用不相同,所而返回的是False。
而至于为什么相同的String会造成引用的不同,呵呵,那就是另外一篇新随笔了。
我个人推荐是:对于几乎所有引用类型,当您希望判断对象性能相等性而不是对象引用一致性时,请使用 Equals,当然String这个特殊的引用类型除外,对字符串使用==增加了代码的可读性(至少我觉得比较清爽^.^,但请切记运算符两段就必须是String类型的表达式!
结论:为了钱包着想,小心使得万年船!
http://hatita.cnblogs.com/archive/2006/01/22/321526.html
- C#.Net一百零一夜(第一夜)
- js一百零一夜之第一夜Jquery id模糊遍历
- c语言一百例
- 第一卷清晨的帝国 第一百四十八章 一夜无言观山景
- C语言经典一百例
- js一百零一夜之第三夜javascript 简单动画实现
- js一百零一夜之第五夜-cookie的使用
- js一百零一夜之第七夜-javaScript this 的用法
- js一百零一夜之第九夜-javascript 匿名函数
- js一百零一夜之第十四夜-正则表达式(1)
- js一百零一夜之第十五夜正则表达式(2)
- 《.net编程先锋C#》第三章 第一个C#应用程序
- 《.net编程先锋C#》第三章 第一个C#应用程序
- 《.net编程先锋C#》第三章 第一个C#应用程序
- C#.NET学习笔记2---C#.第一个C#程序
- C语言经典一百例程序(一)
- 【C语言基础一百题--声明】
- c/c++一百道小程序
- McCabe推荐的代码走查方法
- 通过ADO连接各种数据库的字符串翠集(二)(完)
- [转帖]对C#开发两个基本原则的深入讨论
- SAX入门
- VB编程的市场
- C#.Net一百零一夜(第一夜)
- Java的起源
- Tomcat5.5下配置JNDI JDBC数据源
- .Net应用程序发布问题的最新解决方案,感觉比较爽(可桌面、程序中加自己的ICO及卸载等)
- SQL注入漏洞全接触
- 几种分页算法。翻页必备
- Stored Procedure(存储过程)编写经验和优化措施
- 浅谈中文文本语音转换技术
- 我们为什么要用Java