it-swarm.com.de

beste Möglichkeit, ein Objekt zu erstellen

Dies scheint eine sehr dumme und rudimentäre Frage zu sein, aber ich habe versucht, sie zu googeln, konnte aber keine befriedigende Antwort finden

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

Meine Frage ist, wenn ich eine solche Klasse habe. Wie kann ich ein Objekt am besten erstellen?

Person p=new Person("abc",15)

ODER 

Person p=new Person();
p.Name="abc";
p.Age=15;

Was ist der Unterschied zwischen diesen beiden Methoden und wie lassen sich Objekte am besten erstellen?

25
DevT

Entscheiden Sie, ob Sie ein immutable -Objekt benötigen oder nicht.

Wenn Sie public-Eigenschaften in Ihre Klasse einfügen, kann der Status jeder Instanz jederzeit in Ihrem Code geändert werden. So könnte Ihre Klasse so sein:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

In diesem Fall ist ein Person(string name, int age)-Konstruktor nicht so nützlich.

Die zweite Option ist die Implementierung eines immutable -Typs. Zum Beispiel:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

Jetzt haben Sie einen Konstruktor, der den Status für die Instanz einmal zum Zeitpunkt der Erstellung festlegt. Beachten Sie, dass Setzer für Eigenschaften jetzt private sind. Sie können also den Status nicht ändern, nachdem Ihr Objekt instanziiert wurde.

Es empfiehlt sich, Klassen möglichst als unveränderlich zu definieren. Um die Vorteile unveränderlicher Klassen zu verstehen, schlage ich vor, dass Sie diesen Artikel lesen.

34
davioooh

Hängt wirklich von Ihrer Anforderung ab, obwohl ich in letzter Zeit einen Trend für Klassen mit mindestens einem leeren Konstruktor gesehen habe.

Wenn Sie Ihre Parameter über den Konstruktor buchen, können Sie sich darauf verlassen, dass diese Werte nach der Instantiierung verwendet werden können. Der Nachteil ist, dass Sie mit jeder Bibliothek, die erwartet, Objekte mit einem bloßen Konstruktor erstellen zu können, mehr Arbeit leisten müssen.

Ich persönlich bevorzuge es, zu einem nackten Konstruktor zu gehen und alle Eigenschaften als Teil der Deklaration festzulegen.

Person p=new Person()
{
   Name = "Han Solo",
   Age = 39
};

Dadurch wird das Problem "Klasse fehlt nackter Konstruktor" umgangen und der Wartungsaufwand reduziert (ich kann mehr einstellen, ohne den Konstruktor zu ändern).

9

Es gibt nicht wirklich einen besten Weg. Beide sind ziemlich gleich, es sei denn, Sie möchten mit den Parametern, die während der Initialisierung an den Konstruktor übergeben werden, eine zusätzliche Verarbeitung durchführen oder direkt nach dem Aufruf des Konstruktors einen zusammenhängenden Zustand sicherstellen. Wenn dies der Fall ist, ziehen Sie den ersten vor.

Vermeiden Sie jedoch aus Gründen der Lesbarkeit/Wartbarkeit Konstruktoren mit zu vielen Parametern zu erstellen.

In diesem Fall reichen beide aus.

6
xlecoustillier

Meiner bescheidenen Meinung nach ist es nur eine Frage der Entscheidung, ob die Argumente optional sind oder nicht. Wenn ein Personenobjekt (Name und Alter) (logisch) nicht existieren sollte, sollten sie im Konstruktor obligatorisch sein. Wenn sie optional sind (d. H. Ihre Abwesenheit stellt keine Bedrohung für das einwandfreie Funktionieren des Objekts dar), verwenden Sie die Setter.

Hier ist ein Zitat aus den Symfony-Dokumenten zur Konstruktorinjektion:

Die Verwendung der Konstruktorinjektion bietet mehrere Vorteile:

  • Wenn die Abhängigkeit eine Anforderung ist und die Klasse nicht funktionieren kann, ohne dass sie funktioniert, wird durch das Einfügen über den Konstruktor sichergestellt, dass sie vorhanden ist, wenn die Klasse verwendet wird, da die Klasse nicht ohne diese Klasse erstellt werden kann.
  • Der Konstruktor wird immer nur einmal aufgerufen, wenn das Objekt erstellt wird. Sie können also sicher sein, dass sich die Abhängigkeit während der Lebensdauer des Objekts nicht ändert.

Diese Vorteile bedeuten, dass die Konstruktorinjektion nicht für das Arbeiten mit optionalen Abhängigkeiten geeignet ist. Die Verwendung in Kombination mit Klassenhierarchien ist außerdem schwieriger: Wenn eine Klasse Konstruktorinjektion verwendet, wird das Erweitern der Klasse und das Überschreiben des Konstruktors problematisch.

(Symfony ist eines der beliebtesten und angesehensten PHP-Frameworks)

6
hugo_leonardo

Wenn Sie der Meinung sind, dass weniger Code effizienter ist, ist die Verwendung der Konstruktfunktion besser. Sie können auch folgenden Code verwenden:

Person p=new Person(){
Name='abc',
Age=15
}
4
roast_soul

Abhängig von Ihrer Anforderung, aber der effektivste Weg zum Erstellen ist:

 Product obj = new Product
            {
                ID = 21,
                Price = 200,
                Category = "XY",
                Name = "SKR",
            };
0

Oder Sie können eine Datendatei verwenden, um viele Personenobjekte in eine Liste oder ein Array einzufügen. Sie müssen dazu die System.IO verwenden. Und Sie benötigen eine Datendatei, die alle Informationen zu den Objekten enthält. 

Eine Methode dafür würde ungefähr so ​​aussehen:

static void ReadFile()
{
    using(StreamWriter writer = new StreamWriter(@"Data.csv"))
    {
        string line = null;
        line = reader.ReadLine();
        while(null!= (line = reader.ReadLine())
                {
                    string[] values = line.Split(',');
                    string name = values[0];
                    int age = int.Parse(values[1]);
                }
        Person person = new Person(name, age);
    }
}
0
Chimmy