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
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...
Alex
"Simon Steiner" <any...@anonymous.com> schrieb im Newsbeitrag
news:umMq60fF...@TK2MSFTNGP12.phx.gbl...
> 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/
Alex
"Thomas Scheidegger [MVP]" <spam.ne...@swissonline.ch> schrieb im
Newsbeitrag news:uCplbmhF...@TK2MSFTNGP14.phx.gbl...
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...
Alex
"Thomas Scheidegger [MVP]" <spam.ne...@swissonline.ch> schrieb im
Newsbeitrag news:%23Eh7Cri...@TK2MSFTNGP12.phx.gbl...