Forum: PC-Programmierung C# Get Instanznamen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Anonymous U. (gastt)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Über den Stacktracer könnte das gehen.

von Jan B. (do9jhb)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Jan B. schrieb:
> nameof

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

von Sebastian E. (sbe_15)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.