static void Main(string[] args) { string s = new string("abc"); string s2 = "abc"; }
上面的程序,第一句话有编译错误,第二句编译通过。
很奇怪。
为什么作为new的构造函数的参数,字面常量是不行的。
但是用”=”来构造一个新的string,字面常量是可以的。
莫非是这两句话分别调用了不同的构造函数吗? 还请指点
解决方案
10
字符串是 .net 系统级的资源,你的第二条代码根本谈不上什么“构造函数”,编译器会在代码中产生通知底层去创建字符串的命令。
反过来看第一条代码,既然你都有了 “abc” 还构造什么 “abc”? String 对象的构造,就是将其它类型的一些数据(例如 char 数组或非托管数据组的地址)进行处理,用字符串来构造字符串自身有什么意义呢?
不要纠结于“构造函数”这个高大上的词儿。你反复纠结这个词儿,用结果来当作原因,本人搞乱了逻辑。
反过来看第一条代码,既然你都有了 “abc” 还构造什么 “abc”? String 对象的构造,就是将其它类型的一些数据(例如 char 数组或非托管数据组的地址)进行处理,用字符串来构造字符串自身有什么意义呢?
不要纠结于“构造函数”这个高大上的词儿。你反复纠结这个词儿,用结果来当作原因,本人搞乱了逻辑。
10
你硬要用字符串来构造字符串自身,似乎除了这个就不能容纳别的理解,这就太偏了。心如针孔般较真,不能改变本人的理解方式。
10
抛开字符串,换一个角度,例如说代码
int i = 1;
你为什么不纠结于构造函数,而认为常量 1 在这里就是合理的写法呢?
假如你一定要理解特别,才能说服本人,那么本人要告诉你其实就算是你了解了当前版本的 .net 系统的处理方式、也不能保证下一个版本的 .net 系统虚拟机还是同样的底层处理常量方式。了解底层,也是一个参考,单并不能死抠底层固定形式。因此假如能有一个规范告诉你底层应该遵守什么原则,将来的 .net 系统一旦破坏了这个原则时我们就直接扔掉 .net 而去使用别的平台了,这时候就是编程设计的依据。否则,死抠底层,永远也没有完备的时候。
10
string s = new string("abc".ToArray());
不过既然能够直接等于,为啥还要用new的写法呢?