【问题标题】:why String S =new string() not valid in C# [duplicate]为什么 String S =new string() 在 C# 中无效 [重复]
【发布时间】:2019-02-05 09:03:23
【问题描述】:

在 C# 中我们可以编写

Int a=new int();

char a=new Char();

person p=new person(); 

person 是一个类。
那么为什么我们不能写

string s =new string(); 

毕竟字符串是引用类型。 那为什么不行呢?

【问题讨论】:

  • 有几个字符串构造函数,见msdn.microsoft.com/en-us/library/…。没有没有参数的构造函数,因为无论如何你都可以使用 string.Empty 。这并不少见,在框架和其他地方,您经常会发现类只有带有参数的构造函数。

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


【解决方案1】:

你不能写它,因为string没有构造函数接受0个参数。 相反,您可以编写如下内容:

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

【讨论】:

  • 当您可以将值设置为 string.Empty 时,为什么要这样做?
  • @Deadzone 我刚刚写了他如何通过构造函数获取字符串
【解决方案2】:

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

  • 字符串(字符*)
  • 字符串(Char*, Int32, Int32)
  • 字符串(字符, Int32)
  • 字符串(字符[])
  • String(Char[], Int32, Int32)
  • 字符串(SByte*)
  • 字符串(SByte*, Int32, Int32)
  • 字符串(SByte*, Int32, Int32, Encoding)

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

String testStr = String.Empty;

其实是一样的:

String testStr = "";

【讨论】:

    【解决方案3】:

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

    string s = "String in a C#";
    

    【讨论】:

    • 对 Int 也无用,但我们可以这样做,那为什么不使用字符串呢?
    • 那是因为int, char, .. 是值类型(structs),必须有一个无参数的构造函数。
    • @AkhilJain 字符串是不可变的引用类型。有 ldstr IL 指令允许将新对象引用推送到字符串文字,因此基本上字符串是“特殊”引用类型。它们是不可变的。阅读有关类型的更多信息
    • @ZdeněkJelínek 但是类是引用类型,所以如果我们可以在 Class 中执行此操作,那么为什么不在 String 中!
    • @AkhilJain 一般情况下,您不能使用类来执行此操作,您只能使用具有无参数构造函数的类来执行此操作。如果没有指定其他构造函数,则默认生成无参数类构造函数。 string 类有多个构造函数,没有一个是无参数的,因此不能用无参数的构造函数调用来实例化。
    【解决方案4】:

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

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

    public class C
    {
        public C(int i)
        {
        }
    }
    
    var c = new C(); // invalid
    

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2012-03-27
      • 2015-11-21
      • 2012-06-05
      • 2013-11-25
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多