Laden...

Default Werte für Parameter

Erstellt von Curse4Life vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.414 Views
C
Curse4Life Themenstarter:in
452 Beiträge seit 2005
vor 18 Jahren
Default Werte für Parameter

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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

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.

1.271 Beiträge seit 2005
vor 18 Jahren

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.

4.221 Beiträge seit 2005
vor 18 Jahren

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...