myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Instanz einer Klasse über eine Static Variable identifizieren, macht man das?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Instanz einer Klasse über eine Static Variable identifizieren, macht man das?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
EyeTrackJack EyeTrackJack ist männlich
myCSharp.de-Mitglied

Dabei seit: 24.01.2019
Beiträge: 20
Entwicklungsumgebung: Visual Studio


EyeTrackJack ist offline

Instanz einer Klasse über eine Static Variable identifizieren, macht man das?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo, ich arbeite an einem Programm, wo ich viele Fenster habe, die als Schaltflächen dienen, die man überall auf dem Bildschirm verteilen kann. Wenn davon eine betätigt wird, muss ich wissen, welche das war.

Jetzt ist meine Frage: Ist es in Ordnung, in dem Fall ein static Feld zu deklarieren? Oder wie sollte ich vorgehen? Das Fenster mit der Schaltfläche sollte auch selber wissen, dass es zuletzt betätigt wurde, weil es sich entsprechend einfärbt.

Ich weiß, es ist etwas unspezifisch. Aber ich lese überall, dass man static felder vermeiden sollte, aber hier erscheint mir das die beste Lösung.

Oder sollte ich besser ein Event erzeugen, das dem Erzeuger dieser Fenster mitteilt, wenn eins betätigt wurde, woraufhin er den anderen Fenstern mitteilt, dass sie nicht mehr das zuletzt betätigte sind?

Grüße
Tobias
26.04.2019 00:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.794
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sprichst Du von Feldern oder Eigenschaften?
Aber ja: static gilt es zu vermeiden.

Daher:

Zitat von EyeTrackJack:
die beste Lösung.

No, sicher nicht ;-)

Was Du willst ist prinzipiell ein State, der allen Fenstern bekannt ist.
Das kann man problemlos via Dependency Injection lösen, oder aber auch mit Reactive Extensions.

Um genauer zu helfen musst Du konkreter werden.
26.04.2019 00:34 Beiträge des Benutzers | zu Buddylist hinzufügen
EyeTrackJack EyeTrackJack ist männlich
myCSharp.de-Mitglied

Dabei seit: 24.01.2019
Beiträge: 20
Entwicklungsumgebung: Visual Studio

Themenstarter Thema begonnen von EyeTrackJack

EyeTrackJack ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Abt:
Was Du willst ist prinzipiell ein State, der allen Fenstern bekannt ist.

Es geht mir ziemlich genau darum.

Die Fenster müssen wissen, welches zuletzt aktiv war. Ich denke, es sollte Eigenschaft sein.
26.04.2019 00:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.794
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Naja, dann machst Dir nen WindowState - kann man prinzipiell einfach selbst machen.

C#-Code:
public class WindowStateManager // Such Dir einen besseren Namen aus
{
   public Window CurrentWindow {get;set;}
   public Window LastWindow {get;set;}
}

Dann kannst von jedem Window auf die Instanz zugreifen und CurrentWindow setzen.
Kannst das auch so noch machen, dass beim Setzen von CurrentWindow automatisch LastWindow gesetzt wird.

Sorgst dafür, dass die Anwendung nur eine einzige Instanz dieser Klasse hat (Singleton).
Verwendest Du kein Dependency Injection, was ich nicht hoffe, wirst Du leider kaum um eine statische Instanz der Klasse drumrum kommen (C# Lazy Singleton Pattern zB.).

Statische Instanzen vermeidet man vor allem deshalb, weil sie nahezu nicht oder nur mit sehr hohem Aufwand zu testen sind.
 [Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio
Und Testbarkeit ist das A und O.
26.04.2019 01:04 Beiträge des Benutzers | zu Buddylist hinzufügen
EyeTrackJack EyeTrackJack ist männlich
myCSharp.de-Mitglied

Dabei seit: 24.01.2019
Beiträge: 20
Entwicklungsumgebung: Visual Studio

Themenstarter Thema begonnen von EyeTrackJack

EyeTrackJack ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wieso ist die statische Klasse jetzt besser, als ein statisches Feld bzw. Eigenschaft?
26.04.2019 01:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.794
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hab ich nicht gesagt; ist beides nicht toll.
Besseren Weg hab ich ja erklärt: State via Dependency Injection.

Und das geht halt nur über eine Klasse und nicht über eine Eigenschaft.
Daher auch das Beispiel.
26.04.2019 02:06 Beiträge des Benutzers | zu Buddylist hinzufügen
EyeTrackJack EyeTrackJack ist männlich
myCSharp.de-Mitglied

Dabei seit: 24.01.2019
Beiträge: 20
Entwicklungsumgebung: Visual Studio

Themenstarter Thema begonnen von EyeTrackJack

EyeTrackJack ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zunächst mal Danke für die Information.

Jetzt habe ich mal nach Dependency Injection gesucht und glaube, allgemein verstanden zu haben, wie es gedacht ist.

Das heißt jetzt, dass ich beim Erstellen eines der besagten Fenster diese WindowState Klasse im Konstruktor übergebe. Dann kann ich darüber das aktuelle Fenster ermitteln.

Meine Software zeigt zunächst das Fenster Mainwindow an, von wo dann die Schaltflächen (Instanzen von InteractorWin) erstellt werden.

Dann würde ich im Mainwindow diese Klasse ein Mal deklarieren und bei jedem Erstellen einer Schaltfläche mit übergeben.

Richtig? Augenzwinkern
26.04.2019 16:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.794
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du registrierst alle Abhängigkeiten.

Willst Du dann ein Window öffnen, verwendest Du serviceProvider.GetRequiredService<MeinWindow>() (je nachdem welchen ServiceProvider Du verwendest).
Die Abhängigkeiten werden dann automatisch aufgelöst.

Du kannst auch erst mal alles so belassen, und nur Deinen WindowState registrieren.
In Deinen Fenster verwendest dann im Konstruktor GetRequiredService<WindowState>() - nennt man dann Service Locator Pattern.

Der SLP ist nicht unbedingt zu empfehlen, bringt Dich aber schon mal ein Stück weiter Richtung Dependency Injection.
26.04.2019 18:09 Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.161
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von EyeTrackJack:
Oder sollte ich besser ein Event erzeugen, das dem Erzeuger dieser Fenster mitteilt, wenn eins betätigt wurde, woraufhin er den anderen Fenstern mitteilt, dass sie nicht mehr das zuletzt betätigte sind?

Das wäre die bessere Lösung. Das Fenster muß nichts über die anderen Fenster wissen. Diese Logik sollte im "Erzeuger" (WindowManager o.ä.) implementiert sein. Dann braucht man auch keine statischen Eigenschaften oder DI.
26.04.2019 19:04 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.07.2019 23:13