Entwickler-Ecke

Basistechnologien - Property-Get-Set-Code verkürzen


ebber - Mo 26.01.09 11:21
Titel: Property-Get-Set-Code verkürzen
Hallo,

ich habe in meinem Programm eine Klasse mit mehreren Properties. Diese sollen ungefähr so aussehen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
        private string _SubTitle;
        public string SubTitle
        {
            get
            {
                if (_SubTitle == null)
                    return "";
                else 
                    return _SubTitle;
            }
            set
            {
                _SubTitle = value;
            }
        }


Also im Prinzip nur wenn die Eigenschaft null ist einen Standardwert zurückgeben.
Mein Problem ist, dass ich ca. 30 dieser Dinger habe. Darum wäre das wohl ein bisschen viel Code für fast nix. Kann ich das irgendwie besser schreiben?

MfG


JüTho - Mo 26.01.09 11:32


C#-Quelltext
1:
return String.IsNullOrEmpty(_SubTitle) ? String.Empty : _SubTitle;                    

Und noch etwas kürzer geht es so:

C#-Quelltext
1:
return _SubTitle ?? String.Empty;                    

Siehe SDK-Doku/MSDN Operator ?? (C#-Referenz)

Gruß Jürgen


ebber - Mo 26.01.09 12:21

Danke, daran hatte ich jetzt gar nicht gedacht.
Mein erster Gedanke lag irgendwie in einer komplett anderen Lösung. Aber sollte sich die nicht finden, werden ich das dann so machen.

Jetzt habe ich so eine Liste :


C#-Quelltext
1:
2:
3:
public string Titlee { get; set; }
public string SubTitle  { get; set; }
...


So müsste ich dann die ganzen get und set ausformulieren. Würde das vielleicht auch irgendwie ohne gehen?
Oder irgend welche anderen Vorschläge noch?


Kha - Mo 26.01.09 12:48

Wenn du das wirklich sauber haben willst, solltest du dir einmal AOP, zB mit PostSharp [http://www.postsharp.org], ansehen. Damit kannst du dir ein eigenes DefaultValueAttribute (den Namen gibts leider schon in ComponentModel ;( ), das den Code injiziert, wenn es so verwendet wird:

C#-Quelltext
1:
2:
[DefaultValue("")]
public string Titlee { get; set; }


ebber - Mo 26.01.09 14:30

Danke, aber etwas externes möchte ich dann auch nicht verwenden. Dann scheint mir wohl die oben genannte Lösung die beste.

Aber vielleicht könnte man mein Problem auch anders lösen. Hier tritt es nämlich auf:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
private bool Save(List<Film> ls, string file)
        {
            XElement fi = new XElement("Films",
                            from f in ls
                            select new XElement("Film",
                                new XAttribute("Title", f.Titl),
                                new XAttribute("SubTitle", f.SubTitle),
                                ...));

            fi.Save(file);
            return true;

        }


Wenn eine dieser Eigenschaften die ich speichern möchte null ist kommt der Fehler. Deshalb mein Idee, dass ich das im get ändere. Aber vielleicht ginge das ja auch irgendwie hier in dem LINQ Ding?


Kha - Mo 26.01.09 15:09

Ersetze die new-Aufrufe mit so etwas z.B.:

C#-Quelltext
1:
2:
3:
4:
XAttribute CreateAttribute(XName name, object value)
{
  return value == null ? null : new XAttribute(name, value);
}


PS: Spricht etwas gegen XML-Serialisierung?


ebber - Mo 26.01.09 16:06

Habe ich irgendwie nicht gewusst, dass es XML-Serialisierung gibt. Scheint wohl noch einfacher als Einfach zu sein. Dann werde ich das mal testen. Danke.

MfG