为什么String S = new string()在C#中无效

时间:2017-07-01 12:58:12

标签: c# string primitive-types reference-type

在C#中我们可以写

Int a=new int();

char a=new Char();

person p=new person(); 

人是班级。
那么为什么我们不能写

string s =new string(); 

毕竟string是引用类型。 那为什么不可能?

4 个答案:

答案 0 :(得分:5)

您无法编写它,因为string没有构造函数采用0参数。 相反,你可以这样写:

String a = new string(new char[]{});

答案 1 :(得分:1)

使用构造函数根据另一个现有字符串创建一个新字符串是没有意义的 - 这就是为什么没有允许这样的构造函数重载的原因。只是做

string s = "String in a C#";

答案 2 :(得分:1)

当您创建引用类型(例如类)时,您可以选择它将具有哪些构造函数(对于值类型,需要无参数构造函数,因此您的选择是有限的)。如果未指定any,则会隐式为您创建默认的无参数构造函数。 C#设计团队决定在String类型上使用无参数构造函数是不值得的。这就是你不能打new string()的原因。这就是它的全部内容。

您可以对自定义类执行相同的操作。

public class C
{
    public C(int i)
    {
    }
}

var c = new C(); // invalid

答案 3 :(得分:1)

int和char是原始类型。在C#中,它们实际上只是Int32和Char类的别名。这些类具有没有参数的构造函数。对于Person()类,如果您的代码编译,它也有一个没有参数的构造函数。字符串有点不同。以下是根据MSDN的有效字符串构造函数列表:https://msdn.microsoft.com/en-us/library/system.string.string(v=vs.110).aspx

  • 字符串(字符*)
  • 字符串(字符*,的Int32,Int32)将
  • 字符串(字符,Int32)将
  • 字符串(字符[])
  • 字符串(字符[],的Int32,Int32)将
  • 字符串(为SByte *)
  • 字符串(为SByte *,的Int32,Int32)将
  • 字符串(为SByte *,的Int32,的Int32,编码)

就个人而言,如果我想显式初始化一个字符串而不经过使用上面提到的构造函数的过程,我通常只使用下面的内容:

String testStr = String.Empty;

这与以下内容完全相同:

String testStr = "";