Forum: PC-Programmierung C# Get Instanznamen


von Anonymous U. (gastt)


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");

von STK500-Besitzer (Gast)


Lesenswert?

Über den Stacktracer könnte das gehen.

von Jan B. (do9jhb)


Lesenswert?

Hi,

Möglicherweise ließe sich, dass mit dem nameof Operator von C#6.0 lösen. 
(https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/nameof). 
Bin aber nicht sicher in wie weit es möglich ist, ihn von innerhalb der 
Klasse zu benutzen.

Gruß
Jan B.

von Anonymous U. (gastt)


Lesenswert?

Jan B. schrieb:
> nameof

Da hab ich schon nachgesehen. Das bringt mir nix, soweit ich weiß.

von Sebastian E. (sbe_15)


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.

: Bearbeitet durch User
von nicht"Gast" (Gast)


Lesenswert?

Das klingt nach einem komischen Konzept. Bist du dir sicher, dass du den 
Namen unbedingt brauchst?

Reine Neugier. Was willst du eigentlich damit machen?

von Anonymous U. (gastt)


Lesenswert?

nicht"Gast" schrieb:
> Reine Neugier. Was willst du eigentlich damit machen?

Darf ich nicht genau sagen. Nur so viel: 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.

: Bearbeitet durch User
von Bert3 (Gast)


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?

von Anonymous U. (gastt)


Lesenswert?

Jede neue Instanz einer Klasse erhält automatisch eine einzigartige ID. 
Diese könnte ich prinzipiell verwenden, aber ein lesbarerer Name wäre 
gut.

von nicht"Gast" (Gast)


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.

von Anonymous U. (gastt)


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");

von c-hater (Gast)


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.

von georg (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.