为什么新的String(“Hello”)在C#中无效?

制作背后的逻辑/原因是什么?

String s= new String("Hello World"); 

C#中是非法的? 错误是

`string.String(char *)’的最佳重载方法匹配有一些无效的参数

我对API文档不感兴趣,我感兴趣的是为什么这是非法的。

是因为汇集静态字符串? 像Java池整数(-128)到整数(127)与可怕的结果? (当然还有字符串)

使用构造函数基于另一个现有字符串创建一个新字符串是没有意义的 – 这就是没有允许这样的构造函数重载的原因。 做就是了

 string s = "Hello World"; 

因为字符串是不可变的,并且在构造它们方面具有语言支持。

在您的示例中,由于您使用的是字符串文字,因此将进行实习。 从它创建的任何复制字符串最终都会与实习池一样完全相同。

它是.NET,而不是C#。 查看System.String的构造函数 – none接受System.String

所以它是“非法的”,因为你不能用int构造一个字符串。

 string x = new String(1); 

雷蒙德陈

答案为“为什么不存在此function?” 通常是“默认情况下function不存在。有人必须实现它们。”


我的猜测是每次有人坐下来实现这个构造函数。 他们考虑了String.ToString的实现,并确定构造函数在逻辑上会破坏该方法。

它会给人一种克隆字符串的印象,但字符串是不可变的。

您开始处理不安全的代码之前 ,字符串是不可变的,因此语言设计者选择不添加正常使用中不需要的function。 这并不是说在某些情况下它不会派上用场。

如果你这样做:

 string a = "foobar"; string b = a; Mutate(a, "raboof"); Console.WriteLine("b={0}", b); 

哪里:

 unsafe void Mutate(string s, string newContents) { System.Diagnostics.Debug.Assert(newContents.Length == s.Length); fixed (char* ps = s) { for (int i = 0; i < newContents.Length; ++i) { ps[i] = newContents[i]; } } } 

您可能会惊讶地发现即使字符串'a'是突变的,输出也将是:

  B = raboof 

在这种情况下,人们想写:

 string a = "foobar"; string b = new String(a); Mutate(a, "raboof"); Console.WriteLine("b={0}", b); 

并希望看到如下输出:

  B = foobar的 

但你不能,因为它不是System.String实现的一部分。

我认为这个设计决策的合理理由是任何人都喜欢编写类似不安全的Mutate方法的东西也能够实现克隆字符串的方法。

您尝试使用的构造函数包含…

指向以null结尾的Unicode字符数组的指针

…而不是一个字符串。

(参见http://msdn.microsoft.com/en-us/library/aa331864(v=VS.71).aspx )

只是为了让Eric Lipperts评论可见:

必须在成本效益的基础上certificatefunction。 有什么好处可以certificate成本合理? 如果没有任何好处可以certificate成本合理,那么仅仅基于经济理由我们有更好的事情要做,而不是设计,指定,实施,测试,记录和维护没有人使用或需要的构造函数。

在我结束时,我明白了:

`string.String(char [])’的最佳重载方法匹配有一些无效的参数

可以在发布时键入“char *”代替“char []”。

也许这与我们对文字的历史性理解有关。 在C#之前,用引号括起来的值(比如“astringvalue”)可以被视为字符指针。 但是在C#中,“astringvalue”只是string类的一个对象。 该声明:

 String s= new String("Hello World"); 

意味着创建一个String类的对象并调用其构造函数。 编译器检查可用于字符串类的构造函数列表。 它找不到任何可以接受字符串对象的构造函数(“Hello world”)。 与任何其他情况一样,编译器最好地猜测哪个是重载方法列表中的“最接近”方法 – 在这种情况下,假设字符串值“Hello world”最接近字符数组(char [] ) – 并告诉您“Hello world”(您传递的值)是“char []”的无效值。

在我看来,基本的区别在于.NET和JAVA中的“按引用传递”和“按值传递”。

导致Java中的设计模式 ,原因可能是

用于复制同一类对象的构造函数。

在.NET中,您不需要这样的构造函数来复制/克隆字符串,因为它可以通过以下方式(直接)执行,

‘String test = txtName.Text;’

这是我对.net和java的理解。

我希望我能够给出正确的推理。

感谢致敬

苛刻的Baid