Karron's profile咸鱼翻身还是咸鱼(技术,软件,linux,vim...PhotosBlogListsMore ![]() | Help |
|
|
January 17 .NET中有关string几个特点首先,来做几个题目. int a = 5; int b = 5; Console.WriteLine(Object.ReferenceEquals(a,b)); //----------1 string aa = "Hello"; string bb = "Hello"; Console.WriteLine(Object.ReferenceEquals(aa,bb)); //----------2 string c = "Hel"; string d = c + "lo"; Console.WriteLine(Object.ReferenceEquals(aa,d)); //----------3 string e = "Hel" + "lo"; Console.WriteLine(Object.ReferenceEquals(aa,e)); //----------4 看看上面的输出分别是什么. 正确结果是Flase,True,False,True 如果你答对了,就不用往下看,如果没有答对,你也可以不用往下看 1. 第一个因为存在隐式装箱,会从值类型装箱成引用类型,会创建新的对象,所以结果是False. 2. String是引用类型,string a="a";和string a=new string("a");是等价的,会创建对象,这样说aa和bb应该是不同的对象啊,为什么会是同一个对象呢?原因是这样的,在.NET中因为string类型是不可变的引用类型,也是使用频率最多的类型之一,如果采取普通的创建对象的方式,会带来很多小的string对象,占据内存空间,影响效率.所以,.NET就采取了一种技巧,称为"字符串池",会把代码中的字符串常量Hash起来,所有同样的字符串都是使用同一个对象,因为string是不可变对象,所以这样做是不会有任何问题.所以结果是True,是同一个对象. 3.我们说.NET会Hash字符串常量,但是如果一个字符串是用变量组成,JIT是会创建一个新的对象,所以是False. 4.如果一个字符串是由字符串常量组成,在编译的时候,编译器会自动将其合成一个字符串,可以用ildasm查看il代码便知.这个时候相当于是一个字符串常量,所以结果是True. January 16 OracleOleDbProvider的bug?这两天遇到一个问题,使用sql语句SELECT COUNT(DISTINCT GROUPNAME) FROM TBLMDLFUNCGROUP WHERE
GROUPNAME LIKE '%'调用cmd.ExecuteScalar()方法,发现在执行sql语句的时候,会自动把COUNT(DISTINCT GROUPNAME)变成COUNT(DISTINCTGROUPNAME),中间的空格没有了,导致运行出错. 我怎么跟踪都没发现什么问题,在最后的cmd.CommandText里面的sql都是正确的,最终执行ExecuteScalar()方法的时候就会报错,而换成SqlServer同样的sql是不会报错的,后来改成OracleClient不使用OleDb,也不会报错,难道是OracleOleDb有bug? 我的连接字符串:"Provider=OraOLEDB.Oracle.1;Password=xxx;Persist Security Info=True;User ID=xxx;Data Source=xxx" 我把Provider换成MS提供的OracleOleDb也不会报错,"Provider=MSDAORA.1;Password=xxx;Persist Security Info=True;User ID=xxx;Data Source=xxx",看来真的是Oracle自己的Provider有bug. December 23 RemotingException在远程传递的时候要注意的问题首先,必须在配置文件中的customErrors元素必须设置为off,才能将异常传递到远程客户端.否则客户端就只是会收到一个简单的RemotingException,没有任何详细信息. 二,.NET Framework的异常都可以远程传递.如果是自定义的异常必须满足下面三个条件才能远程传递.
December 21 NUnit2.24发布本来我以为在VS2005发布之后NUnit就会被VS2005里面的单元测试工具给挤出市场,但是后来发现好像只有TeamSuite版本才带有单元测试工具,我现在还没有用上MS的,也不知道怎么样. 但是NUnit还算熟悉,本来以为NUnit对2.0不是很支持,但是在VS2005里面安装上了TestDriven.NET(一个可以集成在VS中的Addin,可以使用NUnit等工具进行测试),居然可以非常好的运行,要知道,TD.NET可以一年多都没有更新了. 今天不错,NUnit2.24正式发布,明确支持.Net Framework2.0,分为两个版本下载,一个For .NET Framework1.1的,一个For2.0的,可以根据需要下载 在这里下载. 下面是what's new:
General
Framework
Console Interface
Forms Interface
December 09 Remoting Exception传递 这两天一直在搞Remoting,有个问题困扰很久,就是我在客户端无法捕捉到服务器正确的异常信息,捕捉到的都是一个简单的,RemotingException,"Server encountered an internal error. For more information, turn on customErrors in the server's .config file.".google好久,都只需要标记为[Serializable]就行了,但是我标记了,还实现了ISerializable接口,还定义了几个所谓的构造函数,结果还是不行. 后来还是把这个错误信息的英文在google搜索才知道.原来如果client和server如果不在同一台机器上,.NET默认只会传递一个generic RemotingException,应该是处于安全的因素.如果要知道正确的异常,不是像报错信息所说的将配置文件中的customErrors设置为on,而是要设置为off.真是郁闷,.NET的错误的报错信息,让很多人都走了误区. |
|
|