2017-07-01 1 views
0

In C# können wirwarum String S = new String() nicht gültig in C#

Int a=new int(); 

char a=new Char(); 

person p=new person(); 

schreiben, wo Person eine Klasse ist.
Also warum können wir nicht schreiben

string s =new string(); 

Schließlich Zeichenfolge eine Art Referenz. Warum ist das nicht möglich?

+1

Es gibt mehrere String-Konstrukteure sind, finden Sie https://msdn.microsoft.com/en-us/library/system.string.string(v=vs .110) .aspx. Es gibt einfach keinen Konstruktor ohne Argumente, weil Sie sowieso string.Empty verwenden können. Das ist nicht ungewöhnlich und im Framework und anderswo finden Sie oft Klassen, die nur Konstruktoren mit Argumenten haben. – ckuri

Antwort

0

Es wäre sinnlos, den Konstruktor zu verwenden, um eine neue Zeichenfolge basierend auf einer anderen vorhandenen Zeichenfolge zu erstellen - deshalb gibt es keine Konstruktorüberladung, die dies ermöglicht. Just do

string s = "String in a C#"; 
+0

nutzlos für Int auch, aber wir können es tun, also warum nicht im Falle von String? –

+0

Das ist, weil 'int',' char', .. sind Werttypen ('struct's), die einen parameterlosen Konstruktor haben müssen. –

+0

@AkhilJain Strings sind unveränderliche Referenztypen. Es gibt die Anweisung ldstr IL, die es ermöglicht, eine neue Objektreferenz auf ein Stringliteral zu setzen, also sind Strings grundsätzlich "spezielle" Referenztypen. Sie sind unveränderlich. Lesen Sie mehr über Typen –

4

Sie können es nicht schreiben, weil string nicht Constructor hat 0 Parameter.

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

Warum sollten Sie das tun, wenn Sie den Wert einfach auf 'string.Empty' setzen können? – Deadzone

+0

@Deadzone Ich habe gerade geschrieben, wie er String mit Konstruktor bekommen kann –

1

Wenn Sie einen Referenztyp (zum Beispiel eine Klasse) erstellt haben, können Sie wählen, was sie haben Konstruktoren (für Werttypen ein parameterlosen Konstruktor erforderlich ist, damit Ihre Wahl: Stattdessen können Sie so etwas schreiben ist begrenzt). Wenn Sie keine angeben, wird implizit ein parameterloser Standardkonstruktor für Sie erstellt. Das C# -Designerteam entschied, dass es keinen Wert hat, einen parameterlosen Konstruktor auf dem String-Typ zu haben. Deshalb können Sie new string() nicht anrufen. Das ist alles dazu.

Sie können das gleiche mit Ihrer benutzerdefinierten Klasse tun.

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

var c = new C(); // invalid 
0

int und char sind primitive Typen. In C# sind sie nur Aliase für die Klassen Int32 und Char. Diese Klassen haben Konstruktoren ohne Parameter. Im Fall Ihrer Klasse Person() hat sie auch einen Konstruktor ohne Parameter, wenn Ihr Code kompiliert wird. Strings sind ein bisschen anders. Hier ist die Liste der gültigen Zeichenfolge Konstruktoren gemäß MSDN: https://msdn.microsoft.com/en-us/library/system.string.string(v=vs.110).aspx

  • String (char *)
  • String (char *, Int32, Int32)
  • String (Char, Int32)
  • String (char [])
  • String (char [], Int32, Int32)
  • String (SByte *)
  • String (SByte *, Int32, Int32)
  • String (SByte *, Int32, Int32, Encoding)

Ich persönlich etwas in der Regel nur folgende verwenden, wenn ich möchte einen String explizit initialisieren, ohne einen Konstruktor unter Verwendung der oben erwähnten durch den Prozess zu gehen:

String testStr = String.Empty; 

die wirklich die gleiche ist, wie:

String testStr = ""; 
Verwandte Themen