none
StackOverFlowException bei einer Eigenschaft RRS feed

  • Frage

  • Hallo zusammen!

    Habe erst sehr wenig Programmiererfahrung und bin bei meinen Bemühungen auf folgendes Problem gestossen:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
      class Person
      {
        public string firstname
        {
          get
          {
            return firstname;
          }
          set
          {
            if (value == "")
            {
              throw new Exception("Kein Vorname ist vorhanden");
            }
            firstname = value;
          }
        }
      }
      class Program
      {
        static void Main(string[] args)
        {
          Person Me = new Person();
          Me.firstname = "Max";
        }
      }
    }
    
    


    Ich definiere die Eigenschaft "firstname" der Klasse "Person". Ich möchte, dass auf diese Eigenschaft auch von anderen Klassen normal zugegriffen werden kann. Wenn der Wert der Eigenschaft abgeändert wird, soll zunächst überprüft werden, ob der zugewiesene Wert überhaupt eine Zeichenabfolge ist (sowas schreibt man doch normalerweise in den Setter, oder?). Falls der zugewiesene Wert "" ist, soll eine Exception ausgelöst werden.

    Wenn ich den Code wie oben eingebe erhalte ich immer eine StackOverFlowException, kann mir vielleicht jemand erklären, was das bedeutet und wie ich den Code zum Funktionieren bringe?

    Vielen Dank ;)

    Dienstag, 12. Juli 2011 18:52

Antworten

  • Hi,

    und wo ist die interne Variable zu Speicherung des Werts?

    In deinem Code passiert folgendes:

    Me.firstname = 'Max'
     -> Aufrufen des Setters der Property "firstname"
       -> Dein Aufruf: firstname = value;
         -> Aufrufen des Setters der Property "firstname"
           -> Dein Aufruf: firstname = value;
             -> Aufrufen des Setters der Property "firstname"
               -> Dein Aufruf: firstname = value;
                 ...

    Und das führt dann irgendwann zu der genannten Exception.

     

    Leg dir eine Variable an, in der der Wert abgelegt wird. Also bspw.:

    private string _firstname;

    public string firstname
    {
        get
        {
            return _firstname;
        }
        set
        {
            _firstname = value;
        }
    }

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 12. Juli 2011 19:07
    Moderator

Alle Antworten

  • Hi,

    und wo ist die interne Variable zu Speicherung des Werts?

    In deinem Code passiert folgendes:

    Me.firstname = 'Max'
     -> Aufrufen des Setters der Property "firstname"
       -> Dein Aufruf: firstname = value;
         -> Aufrufen des Setters der Property "firstname"
           -> Dein Aufruf: firstname = value;
             -> Aufrufen des Setters der Property "firstname"
               -> Dein Aufruf: firstname = value;
                 ...

    Und das führt dann irgendwann zu der genannten Exception.

     

    Leg dir eine Variable an, in der der Wert abgelegt wird. Also bspw.:

    private string _firstname;

    public string firstname
    {
        get
        {
            return _firstname;
        }
        set
        {
            _firstname = value;
        }
    }

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 12. Juli 2011 19:07
    Moderator
  • Vielen Dank für die schnelle Antwort, ich denke das Problem hat sich nun erledigt :).
    Dienstag, 12. Juli 2011 19:31