2016-09-08 11 views
2

Ich lese Datenstrukturen und Algorithmen mit C# (Michael McMillan).Erstellen eines neuen Objekts ohne Parameter übergeben

In Kapitel 3 Seite 43, fand ich Code-Snippet, die Parameter im Konstruktor nehmen, aber ein Objekt erstellen, ohne etwas zu übergeben.

enter image description here

Ist das möglich?

+1

Normalerweise ist es eine gute Idee, Quelltext als Text, nicht als Bild zu posten. –

+0

Um Ihre Frage zu beantworten: Wahrscheinlich gibt es einige Überladungen des Konstruktors. Z.B. eine ohne Parameter wie 'public CArray()' und eine mit 'public CArray (int size)' und vielleicht auch andere. –

+0

Versuchen Sie den optionalen Parameter mit dem Standardwert? –

Antwort

3

könnte es ein paar Möglichkeiten:

  • Ein Tippfehler
  • Es ist eine weitere Überlastung

    public CArray(int size) 
    { 
        // Implementation. 
    } 
    public CArray() 
    { 
        // Other implementation. 
    } 
    
  • es einen Standardwert

    sein könnte

Auch wenn der Code in der Frage zur Verfügung gestellt wird nicht kompiliert ‚as is‘ (ohne eine der drei Erklärungen - es gibt einen Weg eine nicht initialisierte Instanz ohne Konstruktoraufruf zu erstellen haupt System.Runtime.Serialization.FormatterServices mit:

class SomeType 
{ 
    int mVariable; 

    public SomeType(int size) 
    { 
     mVariable = size; 
    } 
} 

static void Main(string[] args) 
{ 
    Type someType = typeof(SomeType); 
    SomeType instance = (SomeType)FormatterServices.GetUninitializedObject(someType); 
    // instance.mVariable = 0; 
} 

beachten Sie, dass diese Methode langsam und unsicher ist, da Sie die class in einer Art und Weise seinem Entwickler meinen Sie nicht auf und manuall verwenden y überschreibt den Konstruktor, daher es sollte nur für Serialisierungszwecke verwendet werden und nicht für die allgemeine Initialisierung.

2

Zunächst ist es ja möglich, aber in diesem Zusammenhang glaube ich nicht. Sie können mehrere Konstrukteure schaffen, die diese Situation ermöglichen würde:

public CArray() { 
    this(5); 
} 
public CArray(int size){ 
    arr = new int[size]; 
    //other logic's must be here 
} 

zu beschreiben: Der erste Konstruktor ist mehr oder weniger die „Default-Konstruktor“, die den anderen Constructor mit dem Parameter Größe eingeben werden. Sie können auch weitere Konstruktoren hinzufügen.

+0

Yep ich weiß, es gibt viele Konstruktor Möglichkeit, Schriftsteller sollte anderen Erbauer auch erwähnen .. –

+0

Ich hoffe, Sie wissen es jetzt. Bitte markieren Sie die beste Antwort (Ihrer Meinung nach) als richtig und akzeptieren Sie sie. –

+0

Dies ist nicht die Syntax für [Aufruf eines Konstruktors aus einem anderen] (http://stackoverflow.com/questions/308276/call-constructor-from-constructor-in-c). –

1

Der parameterlose Standardkonstruktor ist nicht verfügbar Wenn Sie einen benutzerdefinierten Konstruktor mit Parametern in Ihrer Klasse definieren.

Wenn Sie in diesem Fall den parameterlosen Konstruktor behalten möchten, müssen Sie ihn explizit in Ihrer Klasse definieren.

So in Ihrem Beispiel auf der Basis der Klassendefinition Sie zur Verfügung gestellt, ist nicht möglich, eine neue Instanz wie folgt zu erstellen: new CArray()

2

Für den Code CArray kompiliert werden parameterlosen Konstruktor haben muss; die wahrscheinlichste Syntax

public CArray() 
    : this(0) { 
    } 

d.h.wenn size nicht angegeben ist, lassen Sie es gleich zu 0

1

Sie müssen einen Konstruktor haben, ohne Parameter und es gibt einen Weg:

  • 1: Optionaler Parameter
  • 2: Multiple Aufschalten

1: Optional Parameter:

public class CArray { 
    private int[] arr; 
    private int upper; 
    private int numElements; 

    //Constructor with default value parameter 
    public CArray(int size = 0) 
    { 
     //Your logic must be here 
    } 
} 

2: Multiple Aufschalten

public class CArray { 
    private int[] arr; 
    private int upper; 
    private int numElements; 

    //Constructor with zero parameter 
    public CArray() 
    { 
     this = new CArray(0); 
    } 
    public CArray(int size) 
    { 
     //Your logic must be here 
    } 
} 

So am Ende und nach Ihrer Klasse definieren, können Sie in zwei Arten verwendet werden:

var MyArray1 = new CArray(); 
var MyArray2 = new CArray(10); 
Verwandte Themen