Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Default Werte für Parameter
Curse4Life
myCSharp.de - Member



Dabei seit:
Beiträge: 452
Herkunft: Erftstadt

Themenstarter:

Default Werte für Parameter

beantworten | zitieren | melden

Ich habe mit VB 6 und Pascal angefangen, ich weiß nicht mehr ob in beiden oder in nur einer von beiden, aber es war möglich Parametern von Methoden Default Werte zu geben auch in PHP ist das möglich, geht das nicht in C#?
Wäre für mich wieder irgendwo arm, aber ich lasse mich auch hier gerne eines besseren belehren, wenn ich nun diese Methode habe:

public void Test(string ConnString)
{
  // Irgendwas
}
public void Test(string ConnString, bool a)
{
  // Irgendwas
}
public void Test(string ConnString, bool a, bool b)
{
  // Irgendwas
}

So kann ich dem nutzer ermöglichen nur einen Paramter aber auch zwei und drei anzugeben

public void Test(string ConnString, bool a = true, bool b = false)
{
  // Irgendwas
}

Das wäre aber doch millionen mal Codesparender!

Wenn die Methode 100 Zeile umfasst, ist das echt blöd!


Wenn das doch irgendwie geht, bin dankbar für antworten!


mfg
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Kurze Antwort: Optionale Parameter in dieser Form gibt es in C# (VB.NET schon) nicht. Hier die Begründung:

Hejlsberg:
Zitat von Hejlsberg
Okay. The question is, Why don’t we have default parameters? I think there are a couple of reasons. First of all, they’re somewhat duplicative of overloading. I mean you can do the same with overloading, and which is indeed what people do today, but yes, you’re right. It’s more typing for sure. I think the other one is subtler, and in retrospect maybe not as important as I thought. Originally in the language design are- our issue with default parameters is that they burned the default into the call site as opposed to leave it up to the implementation. If you do overloads, let’s say you have void f, and then, let’s say, you have void f of index, for example, and void f of index is where the work happens, right? Then in this guy here, you simply say echo 5, because your default is 5. When the user calls f, it is up to you to change- you can change what your default is later in v2 of your API. When you have a call f somewhere, this by the compiler is translated into f of 5 in the call site, because it just copies that value. Now you can never change the default. This gives you more flexibility, but- and I thought that that was important. Perhaps it’s not all that important, but ...

Auf gut Deutsch: Klassisches Versionierungsproblem! Wenn Default-Parameter herkömmlich implementiert sind, ersetzt der Compiler auf Aufruferseite die fehlenden Parameter (an sich gibt es gar keine optionalen Parameter). Das spart zwar Tipparbeit, erzeugt aber u.U. aber eine Menge Ärger (wenn sich der Default-Parameter bei einem Update ändert, aber die Aufruferseite nicht neucompiliert wird). Und bei C# wird eben defensives Programmieren groß geschrieben, während bei VB mehr der Kompatibiltätsaspekt im Vordergrund steht. Die "saubere" Implementierung optionaler Parameter (z.B. mit Nullable-Objekts) ist zu teuer, weil alle Parameter immer geprüft werden müßten.

In dynamischen Ungebungen (PlugIns, alles schön separiert in DLLs) haben optionale Parameter nix zu suchen. Sie schaden mehr als sie nutzen. Sicherheit geht vor Faulheit.
private Nachricht | Beiträge des Benutzers
progger
myCSharp.de - Member

Avatar #avatar-2094.gif


Dabei seit:
Beiträge: 1.271
Herkunft: Nähe von München

beantworten | zitieren | melden

Das geht doch (zumindest so ähnlich). Das Zauberwort heißt überladen. Du hast in deinem Beispiel nur noch was vergessen:


public void Test(string ConnString)
{
  Test(ConnString,defaultWertFürA[, DefaultWertFürB]); // b ist nicht unbedingt notwendig. Erkennst du warum?
}
public void Test(string ConnString, bool a)
{
  Test(ConnString,defaultWertFürA, DefaultWertFürB);
}
public void Test(string ConnString, bool a, bool b)
{
  // Irgendwas
}
A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Eventuell suchst du folgendes

MethodeBlabla(string pFixerParameter, params object[] pVariableParameter)

Aufruf möglich mit:

MethodeBlaBla("x",1,8,"XY",this,new TextBox());
MethodeBlaBla("x");
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers