Speichern einer Referenz auf ein Objekt
Ein bisschen eine seltsame Frage, aber ich Frage mich wer helfen könnte...
In C++, ich könnte so etwas tun
class MyOtherClass
{
private:
MyLogger* logger;
public:
MyOtherClass (MyLogger* logger)
: logger (logger)
{}
};
class MyClass
{
private:
MyLogger* logger;
public:
MyClass (MyLogger* logger)
: logger (logger)
{}
};
int main (int c, char** args)
{
MyLogger* logger = new MyLogger ();
/* Code to set up logger */
MyOtherClass* myOtherClass = new MyOtherClass (logger);
MyClass* myClass = new MyClass (logger);
}
So, dass jeder von den anderen Objekten (myOtherClass und myClass") enthalten würde, ein Zeiger auf logger, so würden Sie den Aufruf der gleichen logger-Klasse. Allerdings, wie würde ich das gleiche zu erreichen, was in C#? Gibt es eine Möglichkeit, um zu speichern eine Referenz oder ein Zeiger auf eine Globale Objekt - ich vermute, dass in C# wenn ich etwas mache, wie
public class MyClass
{
private MyLogger logger = null;
public MyClass (MyLogger _logger)
{
logger = _logger;
}
};
dass es eigentlich die Zuordnung der Klasse variable logger, um eine Kopie von _logger? Oder bin ich mischen Dinge :S
Jede Hilfe wird sehr geschätzt, und ich danke Ihnen im Voraus!
- Sie sollten Lesen, auf Singletons: en.wikipedia.org/wiki/Singleton_pattern
- Ich habe keine Ahnung, warum singletons sind damit verbunden. AFAIK gibt es keinen Grund, Sie nicht mehr als ein logger.
- Singleton sind oft ein anti-pattern. Vgl. stackoverflow.com/questions/12755539/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eigentlich viel einfacher, in C#.
Grundsätzlich können Sie dies tun:
In C#, die Klassen sind grundsätzlich gehalten um als Referenzen (wirklich nur ein Zeiger unter der Haube). In diesem snippet, übergeben Sie das Referenz zu
logger
zu den Konstruktoren der beiden Objekte. Diese Bezugnahme ist die gleiche, so dass jede Instanz besitzt die gleichenMyLogger
Instanz.In diesem besonderen Fall, haben Sie ziemlich viel brauchen nur zu entfernen die Zeiger-syntax =D
logger
ist eine Referenz auf ein Objekt, nicht das vollständige Objekt selbst. Sie können in der Regel auch keine sorgen darüberdelete
ing, das Objekt entweder nur den Verweis auf null einstellen oder zuweisen einer neuen Referenz später. Der garbage collector kümmert beschneiden, dass der Speicher später.ref
ist nur erforderlich, wenn Sie möchten, um übergabe per Referenz Ihr Objekt-Zeiger, gibt die Methode die EIGENTLICHE Referenz auf die Instanz. In der Regel, die verwendet wird, wenn Sie wollen, dass die Referenz auf die Instanz zu ändern, innerhalb der Methode. Bei der übergabe by value, Ihrer Methode konnte intern vergeben Sie einen neuen Bezug, aber außerhalb des Geltungsbereichs der Methode, die eigentliche Referenz, hat sich nicht geändert.ref
würde es den C++ equivilant der übergabe eines Zeigers auf einen Zeiger auf das Objekt. Wenn das wirklich das, was Sie brauchen (D. H. Sie müssen in der Lage sein, zu ändern, was der Zeiger zeigt in die fuction, anstatt mutiert das zugrunde liegende Objekt), dann soll es so sein. Solche Fälle sind allerdings selten.Sie mischen die Dinge. In C#, Zuweisungsanweisungen wie
kopieren Referenzen, nicht Objekte. Nachdem diese Anweisung ausgeführt wird, gibt es immer noch (am meisten) nur eine
MyLogger
- es ist jetzt bezeichnet von zwei Objekt-Variablen.Wenn der Typ ein Verweistyp ist (was der Fall ist für die Klassen), dann kopieren Sie den Verweis, nicht das Objekt selbst.
In der opposition, um den Typ der Referenz, Sie haben einen Wert-Typen. Werte-Typen sind im Grunde Grundtypen :
int
,double
usw,In Ihrem Fall bedeutet das, dass Sie mit der gleichen Objekte, ob Sie den Zugriff aus der Klasse, oder von der äußeren aufrufende Methode. Es ist, weil Sie auf das referenzierte Objekt.
string
ist ein Referenz-Typ.string s = "hello";SomeMethod(s);"
s` wird immer "Hallo", was auch immer eine Methode habe, mit dem parameter.string s = null;
. Wert-Typen können nicht null sein.