Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Objektübergabe bei Funktionen

2 views
Skip to first unread message

Alexander Widera

unread,
Jan 10, 2006, 6:03:56 AM1/10/06
to
Hallo,

ich habe eine Klasse:
public class Seite
{
public string Name;
}

diese Funktion

void testop(Seite s)
{
s.Name = "geändert";
return;
}

und dieses "Hauptprogramm".

void hauptprogramm()
{
Seite s1 = new Seite();
s1.Name = "seite1";
Console.WriteLine(s1.Name);
testop(s1);
Console.WriteLine(s1.Name);
}

Es erfüllt keinen sinnvollen Zwecke, aber es geht um die
Veranschaulichung
des Problems.

Es wird ein Objekt der Klasse Seite angelegt und ein Attribut Name
zugewießen. Dieser wird ausgegeben. Anschließend die Funktion testop
aufgerufen, die den Name der lokalen Variable s ändern soll. Sie ändert
aber
die "globale" Variable s1 und nicht s. Das zeigt die erneute Ausgabe des
Namen von s1.

Wie kann ich die testop-Funktion NUR das s ändern lassen und nicht s1?
Irgendwie wird die Referenz zu dem Objekt automatisch übergeben und nicht
ein neues Objekt angelegt.

VIelen Dank für Hilfe,

Alex

Simon Steiner

unread,
Jan 10, 2006, 10:49:13 AM1/10/06
to
hallo alex

so z.b.:

void testop(Seite s)
{
Seite s_new= s;
s_new.Name= "geändert";
return;
}

gruss simon

"Alexander Widera"
<aw...@hrz.tu-chemnitz.de-novaliddomainpleasedeletethispart.de> schrieb im
Newsbeitrag news:e4eRQWdF...@TK2MSFTNGP11.phx.gbl...

Alexander Widera

unread,
Jan 10, 2006, 1:51:47 PM1/10/06
to
da muss ich wiedersprechen...
wenn ich das so mache wie du geschrieben hast, dann wird trotzdem das
ausgangsobjekt verändert und nicht "nur s_new".

Alex

"Simon Steiner" <any...@anonymous.com> schrieb im Newsbeitrag
news:umMq60fF...@TK2MSFTNGP12.phx.gbl...

Thomas Scheidegger [MVP]

unread,
Jan 10, 2006, 2:11:02 PM1/10/06
to
Hallo Alexander und Simon

> wenn ich das so mache wie du geschrieben hast, dann wird trotzdem das
> ausgangsobjekt verändert und nicht "nur s_new".

richtig, auch dies verändert die Member-Variable 'Name' von s1 und s ...


> Wie kann ich die testop-Funktion NUR das s ändern lassen und nicht s1?

unmöglich.
Grundsätzlich sind Klassen (class) Referenz-Typen
und s1 & s (+ s_new) sind nur Variablen, die da dieselbe 'Seite' - Instanz referenzieren!

Verhindern kann man da also nichts.

Einige ganz andere Lösungswege:

- erst von s1 eine 1:1 Kopie erstellen und diese an testop() übergeben

- je nach OO/Assembly - Konstellation könnte man 'Name' nicht als 'public definieren,
sondern als (protected, internal, private, protected internal) [und ggf gleich auch korrekter als Property]

- evtl. am besten: das 'API' der 'Seite' - Klasse in C# -Interfaces aufsplitten,
dann an testop() nur das 'erlaubte' Interface übergeben...

--
Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/


Alexander Widera

unread,
Jan 10, 2006, 3:07:48 PM1/10/06
to
OK Danke, also doch der Copy-Konstruktor am besten.
Habe aber noch 2 Fragen:
- was ist das "Property" ?
- wie meinst du das mit den Interfaces und nur das erlaubte übergeben?

Alex

"Thomas Scheidegger [MVP]" <spam.ne...@swissonline.ch> schrieb im
Newsbeitrag news:uCplbmhF...@TK2MSFTNGP14.phx.gbl...

Thomas Scheidegger [MVP]

unread,
Jan 10, 2006, 4:13:50 PM1/10/06
to
> - was ist das "Property" ?

siehe:

http://msdn.microsoft.com/library/en-us/csref/html/vclrfPropertiesPG.asp

public string Name
{
get
{
return name;
}
set
{
name = value;
}
}

Ab .NET 2.0 insbesondere möglich:
Asymmetric Accessor Accessibility
http://msdn2.microsoft.com/75e8y5dd(en-US,VS.80).aspx


> - wie meinst du das mit den Interfaces und nur das erlaubte übergeben?

Interfaces
http://msdn.microsoft.com/library/en-us/csspec/html/vclrfcsharpspec_13.asp

Erstelle ein neues C#-Interface (hier zB mal: IUncritical genannt),
wo alle 'unkritischen' Methoden/Eigenschaften drin sind,
dann also ungefähr so angewendet:

public class Seite : IUncritical
{
....
}

und weiter wird jetzt jener testop()-Methode
nur noch das 'IUncritical' - Interface übergeben :

void testop( IUncritical uncr )
{
uncr.DoSomethingUncritical();
}

so hat diese Methode nicht mehr (direkt) Zugriff auf
alle 'heiklen' Methoden/Eigenschaften der 'Seite'-Klasse.


Ich vermute aber aus deinem Kommentar,
dass du doch eher eine Kopie ('Copy-Constructor') suchst...

Alexander Widera

unread,
Jan 10, 2006, 4:23:23 PM1/10/06
to
Der gepostete Code war nur symbolisch... Er ist nicht mein eigentliches
Problem.
Ich hatte erst einen Copy-Konstruktor verwendet nun aber das Problem auf
eine ganz andere Art und Weise gelöst...
Ich wusste nicht dass man get/set als Property bezeichnet ... aber jetzt wo
du es sagst.
Die Methode mit dem Interface kannte ich nicht. Danke für den Link und den
kleinen Beispielcode... ich werde mich einmal damit beschäftigen.

Alex


"Thomas Scheidegger [MVP]" <spam.ne...@swissonline.ch> schrieb im

Newsbeitrag news:%23Eh7Cri...@TK2MSFTNGP12.phx.gbl...

0 new messages