2009-07-07 6 views

Antwort

7

Sie haben angegeben, dass Sie "sind Verwenden Sie es für eine stark typisierte Ansicht, so habe ich keinen Konstruktor dafür ". Wenn Sie keinen Zugriff auf einen Konstruktor haben, klingt es vielleicht so, als ob Sie keine automatisch implementierte Eigenschaft verwenden sollten.

+0

Nachdem ich darüber nachgedacht habe, verstehe ich nicht, warum Sie keinen Zugriff auf einen Konstruktor haben. Ist diese Eigenschaft nicht im Modell definiert? Das Modell * kann * einen Konstruktor haben. Ich glaube nicht, dass dies etwas damit zu tun hat, ob Sie eine stark typisierte Ansicht verwenden oder nicht, aber ich könnte mich irren. –

2

können Sie die Eigenschaft ...

Blah = String.Empty; 

... aber ich bin mir ziemlich sicher, dass default (string) sowieso. Entschuldigung, Standard (String) ist tatsächlich null. Aber das Einstellen der Eigenschaft funktioniert gut. :)

+3

Ist die Standardzeichenfolge nicht null? – Sean

+0

Zeichenfolge ist standardmäßig auf null und nicht auf leere Zeichenfolge. Bitte korrigieren Sie Ihre Antwort. – Hemant

2

Stellen Sie alle Ihre Standardwerte in einem (parameter) Konstruktor ...

public MyClass() 
{ 
    Blah = string.Empty; 
} 
+0

ich verwende es für eine stark typisierte Ansicht, so dass ich keinen Konstruktor dafür habe. – mrblah

+1

Können Sie ein wenig ausarbeiten? ...wenn Sie die Eigenschaft als 'öffentliche Zeichenfolge implementiert haben Blah {get; einstellen; } ', dann haben Sie sicher auch genug Kontrolle, um der Klasse, auf der diese Eigenschaft existiert, einen Konstruktor hinzuzufügen? – jerryjvl

+0

Dann geben Sie einfach die Membervariablendeklaration ein, yeesh ... –

2

, wenn Sie ein Konstruktor vielleicht fehlt es für eine andere Art und Weise zu tun

private string Blah = ""; 

    public string Bleh { 
    get { return Blah; } 
    set { Blah = value; } 
    } 
10

Wenn Sie ein automatic property wie diese verwenden, ist der Standardwert für den Objekttyp der Wert ist, wenn Sie es an anderer Stelle zu initialisieren, wie im Konstruktor:

public class Person 
{ 
    public string Name { get; set; } 

    public Person() 
    { 
     Name = string.Empty; 
    } 
} 

Wenn Sie jedoch die automatische Eigenschaft eines öffentlichen hat Setter (wie oben gezeigt), dann sind Sie immer noch offen für jemand anderen Einstellung Name null, die Sie einige Probleme verursachen können.

Ich kann zwei Lösungen sehen, abhängig von Ihrem Kontext.

Erstens ändern sich Ihre automatische Immobilie an einen privaten Setzer:

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

    public Person() 
    { 
     Name = string.Empty; 
    } 
} 

Dieses jemand anderes verhindert überhaupt die Eigenschaft ändert. Ist dies nicht bequem ist, können Sie stattdessen ein vollständiges Eigentum nutzen könnten, und nutzen die ?? (null-coalescing) Betreiber nulls zu verhindern:

public class Person 
{ 
    public string Name 
    { 
     get { return mName; } 
     set { mName = value ?? string.empty; } 
    } 

    public Person() 
    { 
     Name = string.Empty; 
    } 

    private string mName; 
} 
0

Gerade im Interesse Ihre Annahmen herausfordernd, warum ist es ein Problem zu haben, eine Null? Unter bestimmten Umständen ist es ein ziemlich bedeutungsvoller Zustand. Wenn Sie diese Eigenschaft Ihrer Klasse verwenden, können Sie immer den string.IsNullOrEmpty (p.Name) -Test verwenden.

2

Nur daran zu erinnern, dass das Initialisieren einer Zeichenfolge zu "" keine gute Übung ist. Eine Zeichenfolge sollte null bleiben, bis ein Wert erhalten wird.

+0

Warum ist es nicht eine gute Praxis? –

+0

Es ist keine gute Übung, da null und "" verschiedene sinnvolle Werte sind und es andere Dinge als den Konstruktor gibt, die Strings auf null setzen können. Zeichenfolgen können null sein, das können Sie nicht ändern, Ihr Code muss mit dieser Tatsache umgehen können. –

+0

Ist keine gute Praxis, weil Leistung und Geschäftslogik. Leistung: Zeichenfolgen sind unveränderlich und daher sehr ineffizient, wenn Sie sie einmal ändern müssen, nachdem sie erstellt wurde. Nachdem Sie einen String sogar mit "" initialisiert haben, setzen Sie einen neuen Wert ein, wenn Sie einen anderen Wert festlegen. Geschäftslogik: Betrachten Sie das Beispiel einer Spalte in Ihrer Tabelle, die Nullwerte zulässt. Also ist null ein Zustand, der berücksichtigt werden muss. Null oder "" sind unterschiedliche Zustände mit unterschiedlichen Bedeutungen und sollten logisch sein, um mit beiden in Ihrer Anwendung zu arbeiten. – Ricardo

0

Ich finde verzögerte analogys helfen.

  • string = leer -> Kid vergessen, seine Schuhe auszuziehen, wenn er nach Hause kam
  • String = null -> Kid hat keine Schuhe ausziehen, wenn er nach Hause
  • angekommen
Verwandte Themen