C# Get Instanznamen

OP #5217884
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");
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
Das klingt nach einem komischen Konzept. Bist du dir sicher, dass du den 
Namen unbedingt brauchst?

Reine Neugier. Was willst du eigentlich damit machen?
Gast
>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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.