Code Bye

string的构造函数能直接接受一个string常量吗

static void Main(string[] args) 
{ 
    string s = new string("abc"); 
    string s2 = "abc"; 
}

上面的程序,第一句话有编译错误,第二句编译通过。
很奇怪。
为什么作为new的构造函数的参数,字面常量是不行的。
但是用”=”来构造一个新的string,字面常量是可以的。
莫非是这两句话分别调用了不同的构造函数吗? 还请指点

解决方案

10

字符串是 .net 系统级的资源,你的第二条代码根本谈不上什么“构造函数”,编译器会在代码中产生通知底层去创建字符串的命令。
反过来看第一条代码,既然你都有了 “abc” 还构造什么 “abc”? String 对象的构造,就是将其它类型的一些数据(例如 char 数组或非托管数据组的地址)进行处理,用字符串来构造字符串自身有什么意义呢?
不要纠结于“构造函数”这个高大上的词儿。你反复纠结这个词儿,用结果来当作原因,本人搞乱了逻辑。

10

你硬要用字符串来构造字符串自身,似乎除了这个就不能容纳别的理解,这就太偏了。心如针孔般较真,不能改变本人的理解方式。

10

抛开字符串,换一个角度,例如说代码
int i = 1;

你为什么不纠结于构造函数,而认为常量 1 在这里就是合理的写法呢?
假如你一定要理解特别,才能说服本人,那么本人要告诉你其实就算是你了解了当前版本的 .net 系统的处理方式、也不能保证下一个版本的 .net 系统虚拟机还是同样的底层处理常量方式。了解底层,也是一个参考,单并不能死抠底层固定形式。因此假如能有一个规范告诉你底层应该遵守什么原则,将来的 .net 系统一旦破坏了这个原则时我们就直接扔掉 .net 而去使用别的平台了,这时候就是编程设计的依据。否则,死抠底层,永远也没有完备的时候。

10

string s = new string("abc".ToArray());

不过既然能够直接等于,为啥还要用new的写法呢?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明string的构造函数能直接接受一个string常量吗