C# Get Instanznamen

OP #5217884
Lesenswert?

Ist es in C# (V7) möglich den Instanznamen eines Objektes irgendwie 
auszugeben?
1
myClass myInstance = new myClass();
2

3
public class myClass
4
{
5
   string Name;
6
   public myClass()
7
   {
8
      Name = Zauberfunktion();
9
      Console.WriteLine(Name); // should print "myInstance"
10
   }
11
}

In dem Minimalbeispiel soll die Zauberfunktion quasi "myInstance" 
zurückliefern. Hintergrund ist, dass ich ansonsten myInstance immer 
doppelt schreiben müsste. So etwa in der Art:
1
myClass myInstance = new myClass("myInstance");
#5217953
Lesenswert?

Die Klasse kann nicht wissen welcher Variable (mit welchem Namen) eine 
Instanz zugewiesen wird. Soll die Instanz benannt werden, so ist die 
Übergabe des Namens als string der richtige Weg:
1
myClass myInstance = new myClass("myInstance");

Um dies syntaxtechnisch abzusichern, gibt es den "nameof" Operator, 
welcher dfür sorgt, dass es ein Code-Element mit dem angegebenene Namen 
auch gibt (andernfalls fliegt ein Syntax-Fehler):
1
myClass myInstance = new myClass(nameof(myInstance));

Vor Einführung des "nameof"-Operators wurden idR Linq-Expressions 
verwendet, z.B. bei Implementierungen von INotifyPropertyChanged.
Dies sähe z.b. so aus:
1
myClass myInstance = new myClass(() => myInstance);
Wie der Konstruktor-Parameter in diesem Fall definiert werden muss, 
müsste ich jetzt selbst nachschlagen.

tl;dr
Du musst den Instanznamen von außen vorgeben.
Gast #5218231
Lesenswert?

>Die in C# instanziierten
>Objekte bilden eine Struktur ab, die dann in eine andere Zielsprache
>übersetzt wird. C#/VisualStudio wird quasi als Infrastruktur mißbraucht.

dann ist doch maximal der Klassenname und nicht der Instanzname relevant 
oder, ansonsten musst du das als Name-Member mit in die Klassen einbauen

alles andere ist sinnfrei, weil es kann x Variablen geben die auf dein 
Objekt verweisen - welcher Name ist dann der richtige?
Gast #5218299
Lesenswert?

Moin,

dann ist es vielleicht sinnvoll eine Art MOC zu benutzen und diesen beim 
Build aufzurufen. Der kann dir dann die benötigten Metadaten erzeugen.

Ich benutze zum Beispiel als pre build event ein script, was mir den 
aktuellen GIT status in ein .cs file schreibt. Dieser kann dann im 
Programm aufgerufen werden.
OP #5218513
Lesenswert?

nicht"Gast" schrieb:
> dann ist es vielleicht sinnvoll eine Art MOC zu benutzen und diesen beim
> Build aufzurufen. Der kann dir dann die benötigten Metadaten erzeugen.

Gute Idee. Ich denke dass das funktionieren würde. Aber ehrlichgesagt 
will ich das Ganze einfach halten und weitere Tools vermeiden. Ich 
bleibe wohl bei der Klassischen Methode:
1
yClass myInstance = new myClass("myInstance");
Gast #5219453
Lesenswert?

Anonymous U. schrieb:

> Ich
> bleibe wohl bei der Klassischen Methode:
>
>
1
> yClass myInstance = new myClass("myInstance");
2
>

Es ist aus logischen Gründen auch die einzig Mögliche. Die Sache ist 
nämlich die: Der Name der Instanz und der Name von Variablen, die sie 
referenziert, hat de facto so gut wie garnix miteinander zu tun. Es sei 
denn, man sorgt dafür, so wie du oben oder wie es auch der Designer des 
VS tut.

Dass es keine wirkliche Abhängigkeit geben kann, ergibt sich aus 
folgenden einfachen Tatsachen:
1) Gleichzeitig kann man ein- und dieselbe Instanz über mehrere 
Variablen referenzieren.
2) Zeitlich nacheinander kann ein- und dieselben Variable 
unterschiedliche Instanzen referenzieren.
1
yClass myInstanceA = new myClass("myInstanceA");
2
yClass myInstanceB = new myClass("myInstanceB");
3
yClass myInstanceC = null;
4
myInstanceC=myInstanceA;
5
myInstanceA=myInstanceB;
6
myInstanceB=myInstanceC;

Danach wird die Instanz mit dem Namen "myInstanceA" durch die Variablen 
myInstanceB und myInstanceC referenziert, und die Instanz "myInstanceB" 
durch die Variable myInstanceA.

Deutlicher kann man wohl den ganze Fragwürdigkeit dieses Ansatzes nicht 
zeigen.

Zumal ja noch nicht mal dafür gesorgt ist, dass der Name über die 
Lebensdauer der Instanz konstant ist. Man kann obiges Beispiel nämlich 
auch noch so erweitern:
1
myInstanceA.Name="holyShit";
2
myInstanceB.Name="holyShit";

Jetzt haben beide Instanzen den gleichen Namen und dieser entspricht 
nicht dem Namen irgendeiner der drei Variablen, die sie referenzieren.
Gast #5219783
Lesenswert?

Anonymous U. schrieb:
> Ich
> bleibe wohl bei der Klassischen Methode:

Was sonst. Variablennamen sind in nahezu jeder Programmiersprache im 
fertigen Programm ohne Bedeutung, dort werden nur noch Adressen 
verwendet. Einzige Ausnahme: man compiliert inklusive 
Debug-Informationen, dann werden Namen und Zeilennummern mit 
abgespeichert für die Verwendung durch den Debugger. Aber man liefert 
natürlich kein Programm mit Debug-Informationen aus.

Georg

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren