Announcement

Collapse
No announcement yet.

Optionale Parameter

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

  • Optionale Parameter

    Guten Abend zusammen.
    Ich hoffe mir kann zu dieser späten Stunde noch jemand mir Rat zu Seite stehen. Es handelt sich um folgendes Problem:

    Nachdem ich eine Weile im Internet gesucht hatte, wurde ich darüber informiert, dass C# erst mit der kommenden 4.0er Version über optionale Parameter verfügen wird. Das Ganze finde ich ein wenig schade und ich wollte mal fragen, ob jemand eine "alternativweg" kennt?

    Ich habe mir gedacht, dass man die jeweilige Methode ja auch einfach überladen kann.

    Bsp:

    [highlight=c#]
    public Int32 Zahl1 { get; set; }

    public Int32 Irgendwas()
    {
    Zahl1 = 1; // "Default"
    }

    public Int32 Irgendwas(Int32 einezahl)
    {
    Zahl1 = einezahl;
    }
    [/highlight]

    Jetzt bekooe ich allerdings ein Problem, wenn ich eine Methode mit "optinalem" Parameter erstelle und diese einer anderen Methode gleicht (beides Int32 Typen)

    Ich hoffe jemand kennt das Problem und kann mir ein wenig helfen.

    Einen schönen Abend noch!
    Myst

  • #2
    Äh ich versteh jetzt dein Problem nicht.

    Dein Beispielcode funktioniert nicht weil deine Methoden einen Returnwert haben du aber nichts zurücklieferst (es fehlt der return). Das hat aber nichts mit Überladung zu tun das Problem hättest du auch bei nur einer Methode.

    [Highlight=c#]
    public Int32 Zahl1 { get; set; }

    public Int32 Irgendwas()
    {
    return Irgendwas(1);
    }
    public Int32 Irgendwas(Int32 einezahl)
    {
    Zahl1 = einezahl;
    return Zahl1;
    }[/Highlight]

    Comment


    • #3
      Ah ja da ist mir wohl ein Fehler unterlaufen.
      Zunächst kurz die Korrektur:

      [highlight=c#]
      public Int32 Zahl1 { get; set; }

      public void Irgendwas()
      {
      Zahl1 = 1; // "Default"
      }

      // Methode mit neuem "optionalem" Parameter
      public void Irgendwas(Int32 einezahl)
      {
      Zahl1 = einezahl;
      }
      [/highlight]

      Und um das Problem zu verdeutlichen:

      [highlight=c#]
      public Int32 Zahl1 { get; set; }
      public Int32 Zahl2 { get; set; }

      public void Irgendwas()
      {
      Zahl1 = 1; // "Default"
      }

      // Methode mit neuem "optionalem" Parameter
      public void Irgendwas(Int32 einezahl)
      {
      Zahl1 = einezahl;
      }

      // Überladene Methode mit einem "richtigem" Parameter
      public void Irgendwas(Int32 einezweitezahl)
      {
      Zahl2 = einezweitezahl;
      }
      [/highlight]

      Hoffe mir ist diesmal nicht wieder ein Fehler unterlaufen..

      Comment


      • #4
        Hallo,

        ich löse das immer so:
        [highlight=c#]
        public class Class1
        {
        public void TueIrgendwas()
        {
        TueIrgendwas(1);
        }

        public void TueIrgendwas(int i)
        {
        // Aufwändige Implementierung (mindestens 1000 Zeilen Code)
        }
        }
        [/highlight]
        Wobei in der parameterlosen einfach die parametrisierte mit dem Standardwert aufgerufen wird.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hmm funktioniert das Ganze auch mit Konstruktoren?

          Ich habe es jetzt einfach so gemacht, dass der optionale Parameter (ist nur einer) als Int16 übergeben wird. Den Zahlenbereich schöpfe ich sowieso nicht aus.

          Trotzdem danke für die Hilfe. Ich werde noch ein wenig probiere.

          Mfg, Myst

          Comment


          • #6
            Hmm funktioniert das Ganze auch mit Konstruktoren?
            Mit Konstruktoren geht es (noch) einfacher:
            [highlight=c#]
            public class Foo
            {
            private int _wert;

            // Konstruktor:
            // Aufruf des Konstruktors durch übergabe eines Standardwertes:
            public Foo() : this(666) { }

            // Konstruktor:
            public Foo(int wert)
            {
            _wert = wert;
            }
            }
            [/highlight]

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Um nocheinmal dein Problem zu klären, Myst und warum es nicht geht: Deine "überladenen" Methoden lassen sich nicht kompilieren, da es keine Überladung ist:
              [highlight=c#]
              public void TueIrgendwas (int i){}
              public void TueIrgendwas (int z){}
              [/highlight]
              Beide Methoden besitzen die gleiche Signatur, für den Compiler entspricht das einer doppelten Deklarierung, welche nicht zulässig ist. Eine Überladene Methode muss sich zumindest in der anzahl der Paramter oder im Typ mindestens eines Parameters unterscheiden, sonst kann bei einem Methodenaufruf nicht ermittelt werden, welche Überladung benutzt werden soll.
              Bsp.:
              Du rufst eine Methode mit folgendem Code auf:
              Code:
              TueIrgendwas(3);
              Welche Variante soll dann benutzt werden?

              Ansonsten kann ich dir gfoidls Vorgehensweise nur empfehlen.
              Just be DRY and KISS your customers.

              Comment


              • #8
                Noch eine Ergänzung zu dieser Bemerkung:

                Originally posted by Myst View Post
                Ich habe es jetzt einfach so gemacht, dass der optionale Parameter (ist nur einer) als Int16 übergeben wird. Den Zahlenbereich schöpfe ich sowieso nicht aus.
                Das ist sinnlos. Unter 32-bit-Systemen benutzt das System intern in der Regel immer einen Int32, auch wenn es als Int16 deklariert wird. Also kannst Du als Standard int benutzen und es dem Framework (bzw. der aktuellen C#-Version) überlassen, wie das umgesetzt wird.

                Jürgen

                Comment


                • #9
                  Ich kenn zwar deinen Verwendungszweck nicht, aber eine weitere möglichkeit wäre das Schlüsselwort
                  Code:
                  params
                  .

                  Kleines Beispiel:

                  [highlight=c#]
                  public void DoSomething(params int[] intParams)
                  {
                  // hier die intParams verarbeiten
                  }
                  [/highlight]

                  Der Aufruf der Methode ist denkbar einfach.

                  [highlight=c#]
                  DoSomething(1,2,3)
                  [/highlight]

                  Gruß Stefan
                  Mitarbeiterführung ist:
                  Den Mitarbeiter so schnell über den Tisch zu ziehen, dass er die Reibungshitze als Nestwärme empfindet!

                  Comment

                  Working...
                  X