Announcement

Collapse
No announcement yet.

Properties in C#

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Properties in C#

    Hallo Form,

    wie kann man innerhalt der Properties einer Liste einen Wert zuweisen?

    Code:
            List<string> content= new List<string>();
    
            public List<string> Content {
                get { return content; }
                set {
                    content.Add(value);
                }
            }
    Ist das machbar? (Fehlermeludungen: 1- Die beste Übereinstimmung für die überladene System.Collections.Generic.List<string>.Add(string )-Methode hat einige ungültige Argumente. 2- Kann nicht von "System.Collections.Generic.List<string>" in "string" konvertiert werden.) Oder muss man da anders vorgehen?

    Dnke im Voraus.

  • #2
    value im Setter einer Property ist vom selben Typ wie die Property selbst.
    Content ist hier vom Typ List<string>. Das gilt auch für value.

    Was der Setter also versucht, ist einer Liste (content) eine weitere Liste (value) hinzuzufügen. Das geht mit der methode Add() nicht.

    Wenn es wirklich das ist, was Du machen willst, dann verwende AddRange().
    Vermutlich willst Du das nicht, sondern willst content = value.

    Comment


    • #3
      Hi,

      vielen Dank.
      Eigentlich habe ich eine List von Objekten, die ich in eine List speichern möchte. Ich habe den Setter-Bereich weggelasen und gesehen, dass ich von außen auch ohne setter die Werte in Content speichern kann. Ob das programmiertechnisch blödsinn ist, weiß nicht:

      Code:
       
                  foreach (var content in MyContents)
                      Content.Add(content);
      Darf man so etwas machen. Oder ist das falsch? Das funktioniert aber auf heden Fall.

      Gruß

      Comment


      • #4
        Natürlich darf man so etwas machen. Kurz gesagt: Was funktioniert, ist auch richtig. Aber "funktionieren" darf man es nur nennen, wenn keine unerwünschten Nebeneffekte auftreten.

        Mit der Verwendung von Add() fügst Du Content bei jedem Aufruf Objekte hinzu. Die Liste wird also mit jedem Aufruf länger. Ob das im vorliegenden Fall gewollt ist, kannst nur Du entscheiden. Falls nicht, reicht schon ein Content.Clear() vorm Iterieren über MyContents um dem Herre zu werden.

        Um nochmal generell zu werden: Ich würde es trotzdem anders implementieren. Du nutzt nämlich ein Implementationsdetail einer Klasse aus, und zwar dass sie Daten in einem Dir bekannten Typ (List<>) speichert. Änderungen hieran können somit Änderungen im aufrufenden Code nach sich ziehen. Das ist ein Zeichen von zu enger Kopplung.

        Comment


        • #5
          Mich würde eher interessieren um was sich die Klasse kümmert in der das steht. Dann könnte ich Dir eine (vermutlich) bessere Implementierung vorschlagen. Wenn Du einen Wrapper um eine Liste brauchst, dann sollte die Liste auf keinen Fall öffentlich gemacht werden, denn dann ist Deine ganze Abstraktion wieder beim Teufel. Ich würde vermutlich so etwas vorschlagen:

          [highlight=c#]
          public class ListAbstraction
          {
          private readonly List<string> _myList = new List<string>();

          // in den seltensten Fällen will ich die Liste öffentlich veränderbar machen
          // dann kann Du ICollection<string> verwenden

          public IEnumerable<string> MyList { get { return _myList; } }

          public void Add(string element)
          {
          _myList.Add(element);
          }

          public void Add(IEnumerable<string> elements)
          {
          _myList.AddRange(elements);
          }
          }
          [/highlight]

          Wenn Du so etwas implementierst können können die Benutzer Deiner Klasse nur noch Elemente hinzufügen. Aber wie gesagt ich würde gerne wissen worum sich Deine Klasse kümmert. Pauschal Aussagen über Quellcode sind sehr schwierig bis unmöglich. In manchen Fällen machen eben seltsame Sachen doch wieder Sinn

          Comment

          Working...
          X