为什么C#中的新字符串(“Hello”)无效

本文关键字:Hello 无效 字符串 为什么 | 更新日期: 2023-09-27 18:10:14

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

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

C#中非法?错误为

与"string.string(char*("匹配的最佳重载方法具有一些无效参数

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

是因为池化静态字符串吗?比如Java池Integer(-128(到Integer(127(,结果非常糟糕?(当然还有字符串(

为什么C#中的新字符串(“Hello”)无效

使用构造函数在另一个现有字符串的基础上创建新字符串是毫无意义的——这就是为什么没有允许这样做的构造函数重载。只做

string s = "Hello World";

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

在您的示例中,由于您使用的是字符串文字,因此它将被插入。任何从中创建的复制字符串最终都将是完全相同的引用,就像它来自实习生池一样。

它是.NET,而不是C#。看看System.String的构造函数-没有一个接受System.String

因此,它是"非法的",原因与你不能用int构造字符串相同。

string x = new String(1);

Raymond Chen

"为什么这个功能不存在?"的答案通常是"默认情况下,功能不存在。必须有人来实现它们。">


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

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

字符串是不可变的,直到你开始处理不安全的代码,所以语言设计师选择不添加正常使用中不需要的功能。这并不是说它在某些情况下不方便。

如果你这样做:

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的评论可见:

必须在成本效益的基础上证明功能的合理性。有什么好处可以证明成本合理?如果没有任何好处可以证明成本是合理的,那么仅仅基于经济理由,即我们有比设计、指定、实施、测试、记录和维护一个没有人使用或需要的构造函数更好的事情要做,这就应该是非法的

在我的一端,我得到了这个:

与"string.string(char[]("匹配的最佳重载方法具有一些无效参数

可能是你在发帖时用"char*"代替了"char[]"。

也许这与我们对文学的历史理解有关。在C#之前,用引号括起来的值(如"astringwalue"(可以被视为字符指针。然而,在C#中,"astringwalue"只是字符串类类型的对象。声明:

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

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

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

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

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

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

'字符串测试=txtName.Text;'

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

我希望我能给出恰当的理由。

感谢

Harsh Baid