myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin

Ressourcen
» guide to C#
» openbook: Visual C#
» openbook: OO
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Knowledge Base » Artikel » [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Vertexwahn
myCSharp.de-Mitglied

Dabei seit: 25.10.2005
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2008


Vertexwahn ist offline

[Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

C# und Übergabemechanismen: call by value vs. call by reference

Motivation

Wissen Sie wie call by value und call by reference in C# funktioniert? Was…? Sie sind ein alter C++ Programmierer und in C# ist doch alles genau so? Hier ein Motivationsbeispiel:

C#-Code:
using System;

class Auto
{
    public Auto(int AnzahlReifen)
    {
        m_AnzahlReifen = AnzahlReifen;
    }
    public int m_AnzahlReifen;
}

public class MyApp
{
    public static void Main()
    {
        Auto MeinAuto = new Auto(4);
        foo(MeinAuto);
        System.Console.WriteLine(MeinAuto.m_AnzahlReifen);  // gibt 4 aus
    }

    static void foo(Auto irgendeinAuto)
    {
        irgendeinAuto = new Auto(6);
    }
}

Wenn sie jetzt verwundert vor dem Bildschirm hocken und sich fragen warum obiges Programm die Zahl 4 ausgibt und nicht die Zahl 6, dann sind Sie ein Leser meine Zielgruppe. Falls nicht, werden sie im folgendem auch nichts neues mehr erfahren.

Alles call by value

Um es kurz zu machen: Parameterübergabe in C# erfolgt implizit immer in Form von call by value.

Jetzt fragen Sie sich sicherlich warum folgendes geht und warum das nicht call by reference ist:

C#-Code:
using System;

class Auto
{
    public Auto(int AnzahlReifen)
    {
        m_AnzahlReifen = AnzahlReifen;
    }
    public int m_AnzahlReifen;
}

public class MyMain
{

    public static void Main()
    {
        Auto MeinAuto = new Auto(4);
        foo(MeinAuto);
        System.Console.WriteLine(MeinAuto.m_AnzahlReifen);  // gibt 6 aus
    }

    static void foo(Auto irgendeinAuto)
    {
        irgendeinAuto.m_AnzahlReifen = 6;
    }
}

Die Erklärung ist ganz einfach. Übergibt man eine Referenz an eine Methode, so wird ihr Inhalt kopiert. Was ist der Inhalt eine Referenz? Der Inhalt einer Referenz ist nur ein Verweis, der angibt, wo sich das zugehörige Objekt befindet. Wenn man also eine Referenz an eine Methode übergibt wird eine Kopie der Referenz an die Funktion übergeben.

C#-Code:
Auto A = new Auto();
doSomething(A);

void doSomething(Auto B)
{
   // mache etwas mit B
}

Bei dem Aufruf der Methode doSomething wird eine zweite Referenz angelegt, die auf das Objekt Auto verweist. Verändert die Referenz B das Objekt so wirkt sich dies auf das Auto Objekt aus.

Man kann in der Methode doSomething das Auto Objekt verändern, aber nicht die Referenz A.

Sehen Sie sich jetzt noch einmal das Motivationsbeispiel an und stellen Sie fest warum 4 und nicht 6 ausgegeben wird.

Man kann in der Methode doSomething nicht die Referenz A auf ein anderes Objekt zeigen lassen, da man nur mit einer Kopie arbeitet.

C#-Code:
Auto A = new Auto();
doSomething(A);

void doSomething(Auto B)
{
    B = new Aute(); // beeinflusst nicht die Referenz A
}

Es bleibt festzuhalten: C# arbeitet mit call-by-value, auch wenn man Referenzen übergibt. Bei Java ist es genau so.

Call by refernece

In C# ist auch call by reference bei der Paramterübergabe möglich. Dabei wird vor jedem Parameter der per call by reference übergeben werden soll das Schlüsselwort ref gestellt:

C#-Code:
using System;

class Auto
{
    public Auto(int AnzahlReifen)
    {
        m_AnzahlReifen = AnzahlReifen;
    }
    public int m_AnzahlReifen;
}

public class MyMain
{

    public static void Main()
    {
        Auto MeinAuto = new Auto(4);
        foo(ref MeinAuto);
        System.Console.WriteLine(MeinAuto.m_AnzahlReifen);  // gibt 6 aus
    }

    static void foo(ref Auto irgendeinAuto)
    {
        irgendeinAuto = new Auto(6);
    }
}

Das Schlüsselwort out

Häufig besitzen Methoden Ergebnisparameter. Ergebnisparameter sind Parameter, die nur auf der linken Seite einer Anweisung auftreten. Ihr Wert vor der Ausführung der Methode ist also bedeutungslos. Beispiel:

C#-Code:
using System;

class MyClass
{
    static void Main(string[] args)
    {
        int ergebnis = 0;
        add(3, 2, ref ergebnis);
        System.Console.WriteLine(ergebnis); // gibt 5 aus
    }

    static void add(int x, int y, ref int ergebnisparameter)
    {
        ergebnisparameter = x + y;
    }
}

Der Wert von ergebnis ist bedeutungslos, da dieser sowieso mit dem Wert 5 (x+y) überschrieben wird. Die Initialisierung der Variablen ergebnis mit einem bestimmten Wert (z. B. 0) ist unsinnig, da das Ergebnis von x und y abhängig ist. Lässt man die Initialisierung weg, bekommt man eine Fehlermeldung der Art „Verwendung einer nicht zugewiesener lokalen Variablen“:

C#-Code:
using System;

class MyClass
{
    static void Main(string[] args)
    {
        int ergebnis; // keine Initialisierung
        add(3, 2, ref ergebnis); // FEHLER:
          // Verwendung einer nicht zugewiesener lokalen Variablen
        System.Console.WriteLine(ergebnis);
    }

    static void add(int x, int y, ref int ergebnisparameter)
    {
        ergebnisparameter = x + y;
    }
}

Abhilfe schafft hier das Schlüsselwert out, welches einen Parameter als Ergebnisparameter kennzeichnet. Parameter, die mit out gekennzeichnet sind, müssen nicht initialisiert werden:

C#-Code:
using System;

class MyClass
{
    static void Main(string[] args)
    {
        int ergebnis;
        add(3, 2, out ergebnis);
        System.Console.WriteLine(ergebnis); // gibt 5 aus

        System.Console.ReadLine();
    }

    static void add(int x, int y, out int ergebnisparameter)
    {
        ergebnisparameter = x + y;
    }
}

Grundsätzlich ist es guter Stil Variablen gleich zu initialisieren, damit man davor bewahrt wird eine nicht initialisierte Variable zu verwenden. Ein Compiler, der eine Warnung bei benutzen einer nicht initialisierten Variablen ausspuckt, ist ein wahrer Segen. Mit bedacht kann man aber das Schlüsselwort out ruhigen Gewissens einsetzen.

Ein weiterer Vorteil des out Parameters ist die Rückgabe von mehreren Ergebnissen. Natürlich kann man dies auch mit Rückgabewerten von Methoden erreichen, jedoch ist man hier auf einen einzelnen Rückgabewert beschränkt. Eine Methode kann nicht zwei Werte zurückgeben. In solchen Fällen kann man zwar überlegen, ob es nicht sinnvoll ist beide Rückgabeparameter zu einen neuen Typ zusammenfassen und dadurch einen einzelnen Rückgabewert zu schaffen, jedoch gibt es Situationen, in denen eine Zusammenfassung aufgrund der Semantik der Daten einfach nicht sinnvoll ist, da die Daten logisch nicht zusammengehören oder es ist einfach bequemer zwei „Rückgabewerte“ bereitzustellen.

Beispiel:

C#-Code:
private void getProxySettings(out string IP, out int Port)
{
    // IP und Port als String zurueckgeben [hier fehlt Code!]
}

Schlusswort

Ich hoffe der Unterschied zwischen call by value und call by reference ist klar geworden. Der direkte Zugriff auf als public Elemente, wie in den obigen Beispielen gezeigt (MeinAuto.m_AnzahlReifen) ist natürlich kein sauberer Stil. Die Art des Zugriffs auf public Elemente, wurde gewählt um den Umfang der Beispielprogramme möglichst gering und übersichtlich zu halten. Anstelle von direktem Zugriff auf Datenelemente sollte man so genannte Getter- und Settermethoden benutzen. In C# sind diese als Properties bekannt. Wer diese nicht schon lange kennt, sollte danach mal googeln.

Dieser Beitrag wurde 9 mal editiert, zum letzten Mal von Vertexwahn am 29.11.2005 19:21.

18.11.2005 22:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Vertexwahn,

ich finde deinen Artikel gut. Nette Einleitung, gute Motivation.

Du solltest allerdings 'out' noch in dem Artikel erklären, ist ja schnell gemacht. Zumal man, wenn man bei google nur nach 'out' sucht, nicht wirklich fündig wird.

Was mir auch nicht gefällt ist das public Field m_AnzahlReifen. Gerade wenn Anfänger den Artikel lesen, werden die dann auf eine falsche Fährte geführt. Ich weiß aber leider auch keine richtig Lösung, weil die an sich sinnvollen Properties hier das Verständnis vermutlich erschweren. Du könntest aber zumindest in einem Nachwort klarstellen, dass man public Fields meiden sollte.

herbivore
18.11.2005 23:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Vertexwahn
myCSharp.de-Mitglied

Dabei seit: 25.10.2005
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2008

Themenstarter Thema begonnen von Vertexwahn

Vertexwahn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von herbivore:
Du solltest allerdings 'out' noch in dem Artikel erklären, ist ja schnell gemacht. Zumal man, wenn man bei google nur nach 'out' sucht, nicht wirklich fündig wird.

Was mir auch nicht gefällt ist das public Field m_AnzahlReifen

Habe die Änderungen vorgenommen!
20.11.2005 18:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Vertexwahn,

fein! Wird immer besser. Vielleicht könntest du noch eine Antwort auf die Frage "Warum soll ich out benutzen, wenn ich ebenso gut einen Rückgabewert nehmen kann?" geben, die man sich bei dem konkreten Beispiel leicht stellen kann.

Dann musst du eigentlich nur noch den Titel ändern und einen Admin dazu bringen, den Beitrag ins Forum Artikel zu verschieben.

herbivore
20.11.2005 18:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Vertexwahn
myCSharp.de-Mitglied

Dabei seit: 25.10.2005
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2008

Themenstarter Thema begonnen von Vertexwahn

Vertexwahn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Warum soll ich out benutzen, wenn ich ebenso gut einen Rückgabewert nehmen kann?

weil es nicht 2 Rückgabewerte gibt Augenzwinkern mmh... soll ich das wirklich noch dazu schreiben
29.11.2005 11:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Vertexwahn
myCSharp.de-Mitglied

Dabei seit: 25.10.2005
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2008

Themenstarter Thema begonnen von Vertexwahn

Vertexwahn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beispiel

C#-Code:
private void getSupporter(out string IP, out int Port)
{
    // IP und Port als String zurueckgeben
}

mmh..
29.11.2005 13:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Vertexwahn,

Zitat:
soll ich das wirklich noch dazu schreiben

ja :-)

Das Beispiel ist doch auch gut.

herbivore
29.11.2005 17:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Vertexwahn
myCSharp.de-Mitglied

Dabei seit: 25.10.2005
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2008

Themenstarter Thema begonnen von Vertexwahn

Vertexwahn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ok ich habs eingebaut Augenzwinkern
29.11.2005 19:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.221
Entwicklungsumgebung: VS2003-VS2013 / SAP WebIDE
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was für einen FAQ-Artikel noch fehlt ist der folgende Hinweis:

Obwohl in C# ein ref-Parameter inizialisiert werden muss damit er übergeben werden kann sollte man in DLL's (welche in verschiedenen Sprachen verwendet werden können) trotzdem den Wert überprüfen bevor er verwendet wird... dies aus folgenden Gründen:

a) ein Wert kann mit null inizialisiert werden (geht in allen Sprachen)

b) Andere .Net Sprachen unterscheiden nicht zwischen ref und out.... so ist es z.B: in VB.Net problemlos möglich mit ByRef einen nicht inizialisierten Wert an einen ref-Parameter zu übergeben (die Prüfung in VB entfällt, da VB keine Unterscheidung zwischen ref und out kennt).
29.11.2005 19:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 2 Monate.
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

der Artikel steht jetzt in 'Artikel'. :-)

herbivore
21.02.2006 19:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Bernhard
myCSharp.de-Mitglied

Dabei seit: 17.06.2005
Beiträge: 119


Bernhard ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Wissen Sie wie call by value und call by reference in C# funktioniert? Was…? Sie sind ein alter C++ Programmierer und in C# ist doch alles genau so?

Nur so als kleine Anmerkung, nachdem ich auch von C++ gewechselt bin: Es funktioniert in der Tat genau so. Auch in C++ wird alles, sofern kein & dabei steht, per Value übergeben, also bei "Wertetypen" eben der Inhalt selbst und bei Zeigern eben die Adresse. Das Äquivalent zum ref Schlüsselwort in C# ist dann eben das & nach dem Typ des Parameters.

C#-Code:
// Speicherlecks werden in diesem Beispiel einfach mal ignoriert ..

void foo1(Auto* auto) {
    auto = new Auto(6);
    // letztendlich wird 4 ausgegeben
}

void foo2(Auto* auto) {
    auto->setAnzahlReifen(6);
    // letztendlich wird 6 ausgegeben
}

void foo3(Auto*& auto) {
    auto = new Auto(6);
    // letztendlich wird 6 ausgegeben
}

grüße
26.02.2006 18:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Vertexwahn
myCSharp.de-Mitglied

Dabei seit: 25.10.2005
Beiträge: 179
Entwicklungsumgebung: Visual Studio 2008

Themenstarter Thema begonnen von Vertexwahn

Vertexwahn ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Es funktioniert in der Tat genau so

Du hast Recht.

Hier der C++ Code zum Testen im Compiler:

C#-Code:
#include <iostream>
using namespace std;

class Auto
{
public:
    Auto(int AnzahlReifen)
    {
        m_AnzahlReifen = AnzahlReifen;
    }

    int m_AnzahlReifen;
};

// Speicherlecks werden in diesem Beispiel einfach mal ignoriert ..

void foo1(Auto* a) {
    a = new Auto(6);
    // letztendlich wird 4 ausgegeben
}

void foo2(Auto* b) {
    b->m_AnzahlReifen = 6;
    // letztendlich wird 6 ausgegeben
}

void foo3(Auto*& c) {
    c = new Auto(6);
    // letztendlich wird 6 ausgegeben
}

int main()
{
    Auto x(4);

    foo1(&x);
    cout<<x.m_AnzahlReifen<<endl;

    foo2(&x);
    cout<<x.m_AnzahlReifen<<endl;

    x.m_AnzahlReifen = 4;

    Auto *ptr = &x;
    foo3(ptr);
    cout<<x.m_AnzahlReifen<<endl;

    cout<<ptr->m_AnzahlReifen<<endl; // gibt 6 aus.

    cin.get();
}
27.02.2006 11:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 6 Monate.
wdb.lizardking wdb.lizardking ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2010.jpg


Dabei seit: 28.08.2006
Beiträge: 100
Entwicklungsumgebung: Visual Studio .NET 2008
Herkunft: Niederbayern


wdb.lizardking ist offline Füge wdb.lizardking Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für den guten Artikel.
Für einen Umsteiger von C++ wie mich war er sehr hilfreich.
28.08.2006 10:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 5 Monate.
Peter Bucher Peter Bucher ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-4103.jpg


Dabei seit: 17.03.2005
Beiträge: 5.879
Entwicklungsumgebung: VS 2017 / VS Code
Herkunft: Zentralschweiz


Peter Bucher ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen

Dank diesem Artikel und da es bei mir noch nicht 100% "Klick" gemacht hat, habe ich mich ein wenig in dieses Thema vertieft.
Nach diversen Tests und Vergleichen habe ich es schlussendlich verstanden.
Auf Idee meiner Schwester, habe ich einen Artikel dazu geschrieben, um es noch einmal zu verinnerlichen und eventuell anderen damit zu helfen.

Da ich denke dass mein Artikel eine gute Ergänzung zu diesem Artikel darstellt, poste ich den Link hier nach der Rücksprache und Zustimmung von Herbivore.

-  Artikel - Parameterübergabe in C# (by value, by reference und out)


Gruss Peter

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Peter Bucher am 21.02.2007 20:22.

21.02.2007 20:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Moooitic Moooitic ist männlich
myCSharp.de-Mitglied

Dabei seit: 20.03.2007
Beiträge: 15


Moooitic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

Da ich jetzt schon öfter bei euch auf der Seite gelandet bin melde ich mich nun einfach mal an ;-)

Die Beschreibung von out und der Art der Argumentübergabe ist gut geworden allerdings habe ich eine kleine kritik :-)
(Gerade was die Strategie der 2 Rückgabewerte betrifft...)

Ihr solltet definitiv erwähnen das es beim out-Schlüsselwort einzig und allein um einen geschwindigkeitsvorteil geht.
Out exsistiert in C# als eine art "Pointerersatz" (ja ich weiß es ist nicht das selbe) und ist ein Sprachmittel der C-familie das nicht den regeln der OOP entspricht (Kapselung wird gebrochen) sondern eher historisch (mit hinein) gewachsen ist.

Es ist kein guter Programmierstil out zu nutzen wenn es nicht von nöten ist.

Es gibt 3 grundlegende möglichkeinen out in C# zu vermeiden.
1. Methoden im Object schreiben und nicht C-style Methoden die Objecte bekommen.( das ist C da hat es einen Grund gehabt so zu schreiben - es gab keine Objekte) gerade dieser Punkt kann dem "out" wort jeden Geschwindigkeitsvorteil nehmen.
2. Methoden die ein Object bekommen und das selbe verändert wieder zurückgeben (1 ist zu preferieren)
3. Mehrere Rückgabewerte ? Array nutzen oder Strukturen oder Obekte ... und Daten verpacken (Strukturen preferiert das ist ihr Sinn - das Verpacken von Argumenten um diese weiterzugeben :-))

Man sieht das all diese Methoden vollkommen OO sind und sich damit besser strukturierter (und modernerer )Code schreiben lässt.

Es mag viele C/C++ Programmierer geben die jetzt aufschreien wollen gerade c++ Programmierer haben dazu aber keinen Grund da es auch in C++ schon ein falscher weg ist übermäsig mit Methoden die Objekte bekommen und nicht Objekte die Methoden haben zu arbeiten (kommt daher das c++ Programmierer mal aus C kamen und das eingeschleppt haben :-D)

(IN C haben Pointer natürlich einen Sinn gerade was Hardwarenähe betrifft und in C++ auch ... ich will auch nicht sagen das OUT in C# quatsch ist ABER wenn es geht sollte man es umgehen.)

Ansonsten viele Grüße - eine tolle Seite :-)

Rechtschreiben 5 -_- sorry editedit x-D

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Moooitic am 20.03.2007 19:08.

20.03.2007 17:00 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Moooitic,

im Prinzip hast du recht, nur ist das kein spezifisches Problem von out, sondern ist bei der Verwendung von return ganz genauso zu beachten.

Zitat:
Ihr solltet definitiv erwähnen das es beim out-Schlüsselwort einzig und allein um einen geschwindigkeitsvorteil geht.

Nö, das würde ich nicht sagen. Die TryParse-Methoden sind ein gutes Beispiel für die sinnvolle und oo-konforme Verwendung von out.

herbivore
21.03.2007 06:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Borg
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.08.2006
Beiträge: 1.529
Entwicklungsumgebung: VS2005
Herkunft: Berlin, Germany


Borg ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Die TryParse-Methoden sind ein gutes Beispiel für die sinnvolle und oo-konforme Verwendung von out.

Nun ja, soweit würde ich nicht gehen. TryParse hat ja auch bloß das Problem zweier Rückgabewerte.
Prinzipiell sind out-Parameter wirklich (oo-gesehen) überflüssig. Oo wäre es, wenn Parse ein entsprechendes Objekt zurückgibt. Allerdings macht das die Schreibweise oftmals komplizierter.

C#-Code:
// statt
int myInt;
if (int.TryParse( myString, myInt))
{
   // ...
}

// müsste man
int.ParseResult ipr = int.Parse( myString );
if (ipr.Successful)
{
   int myInt = ipr.Value;
   // ...
}
// schreiben
21.03.2007 13:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 3 Monate.
chrische5 chrische5 ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 489
Entwicklungsumgebung: Visual Studio 2005
Herkunft: Europa


chrische5 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo

Zitat:
Original von Vertexwahn

C#-Code:
Auto A = new Auto();
doSomething(A);

void doSomething(Auto B)
{
B = new Aute(); // beeinflusst nicht die Referenz A
}

Das soll sicher

C#-Code:
b= new Auto();

heißen. Soll nicht nerven, sondern nur mein erster Beitrag zur Community sein.

Sonst toller Artikel, der mir als c++er sehr geholfen hat. Gibt es eigentlich eine
Entsprechung für const in c#?

chrische
04.07.2007 14:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Leuchtturm Leuchtturm ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.05.2007
Beiträge: 43
Entwicklungsumgebung: VS 2005 express
Herkunft: Sachsen


Leuchtturm ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Doch const Augenzwinkern So wiet ich weiß geht das bei prozeduren aber nicht
04.07.2007 16:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo chrische5,

 Konstante Parameter

Prophylaktisch: Bitte keine langen Diskussionen in Artikel-Threads.

herbivore
04.07.2007 17:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 11 Monate.
MrLeeh MrLeeh ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-701.gif


Dabei seit: 19.02.2008
Beiträge: 194
Entwicklungsumgebung: Visual Studio
Herkunft: Deutschland


MrLeeh ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sehr guter Artikel. Der bringt endlich mal Licht ins Dunkel der ByValue und ByReference Geschichte. Da denkt man, man hat schon lange alles verstanden und auf einmal war es doch ganz anders. Vielen Dank für die Mühe.
21.06.2008 18:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
Lumbra Lumbra ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-2938.gif


Dabei seit: 15.05.2008
Beiträge: 115
Entwicklungsumgebung: Visual Studio 2008 Prof.
Herkunft: Köln


Lumbra ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Leider sind die Dateien im Startposting nicht mehr verfügbar. Gibt es eine neue URL?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lumbra am 17.07.2009 19:10.

17.07.2009 19:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
winSharp93 winSharp93 ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2918.png


Dabei seit: 19.01.2007
Beiträge: 5.742
Herkunft: Stuttgart


winSharp93 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Lumbra:
Leider sind die Dateien im Startposting nicht mehr verfügbar. Gibt es eine neue URL?

Der Inhalt war - soweit ich weiß - identisch mit dem Text im ersten Posting.
17.07.2009 19:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.444
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Lumbra, hallo winSharp93,

Zitat:
Der Inhalt war - soweit ich weiß - identisch mit dem Text im ersten Posting.

so ist es. Da der Inhalt also weiterhin vollständig enthalten ist, nur eben nicht mehr in unterschiedlichen Dateiformaten vorliegt, habe ich die jetzt unnütz gewordenen Links entfernt.

herbivore
18.07.2009 00:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 13 Jahre.
Der letzte Beitrag ist älter als 9 Jahre.
Antwort erstellen


© Copyright 2003-2018 myCSharp.de-Team. Alle Rechte vorbehalten. 14.12.2018 23:24