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
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Ansprehcen von Eigenschaften und Methoden von Objekten (objektorientierte Programmierung)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Ansprehcen von Eigenschaften und Methoden von Objekten (objektorientierte Programmierung)

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

Dabei seit: 02.05.2019
Beiträge: 2
Entwicklungsumgebung: Visual Studio 2019 / Win10
Herkunft: Österreich


BlauerTeddy ist offline

Ansprehcen von Eigenschaften und Methoden von Objekten (objektorientierte Programmierung)

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

Hallo liebe Programmierer!

Ich habe ein Problem für das ich seit Wochen in meiner Freizeit eine Lösung suche. Bitte lacht Euch nicht kaputt, wenn ihr mein Problem seht. Aber ich kapiers einfach nicht..

Ich möchte nachdem ich eine Klasse angelegt habe, Objekte davon anlegen. Soweit klappt das auch alles. Aber wenn ich die Methoden des Objekts oder seine Eigenschaften ansprechen möchte, bekomme ich nur eine Fehlermeldung.

Ich schreibe in C# mit WPF, aber ich denke nicht, dass es ein WPF-Problem ist.

C#-Code:
namespace Objekte_und_Methoden_Test
{
    class Helden
    {
        public string name { get; set; }
        public int alter;
        public int stärke;
        public int lebensenergie;

        public void Kampf(int schaden)
        {
            lebensenergie = stärke - schaden;
        }

        public void Heilung()
        {
            lebensenergie++;
        }
    }
}

Mein eigentlicher Programmcode:

C#-Code:
namespace Objekte_und_Methoden_Test
{

    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            Helden Marco = new Helden();
            {
                Marco.alter = 20;
                Marco.name = "Marco";
                Marco.lebensenergie = 20;
                Marco.stärke = 10;
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Marco.alter++; //<--- FEHLER
        }
    }
}

Mein Problem ist, dass er "Marco.alter" nicht erkennt. Er sagt dann immer

Fehlermeldung:
"CS0103 Marco ist im aktuellen Kontext nicht vorhanden."
02.05.2019 21:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 265
Entwicklungsumgebung: VS2012
Herkunft: Köln


KroaX ist offline

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

Im Scope deine Button Click Methode die vermutlich über einen Eventhandler ausgeführt wird ist die Instanz deiner Klasse Helden bereits nicht mehr verfügbar.

Der Ablauf bei dir wäre:

- MainWindow wird erstellt
- Klasse Helden wird erstellt
- Klasse Helden wird verworfen da sie nirgendwo zwischengehalten wird
-

Du kannst dir das so vorstellen, als dass am Ende jeder Methode alles weggeräumt wird was du innerhalb einer Methode gemacht hast, es sei denn du tust Dinge um deine erstellten Konstrukte irgendwo zwischen zu speichern. Gewöhnlich passiert das über instanzvariablen. Ähnlich hast du das bereits bei deiner Helden Klasse gemacht.

Natürlich ist es nicht unbedingt immer klug alles in Klassenvariablen zwischen zu halten, aber für dein momentanes Verständnis sollte dich diese Info vielleicht weiterbringen.
02.05.2019 21:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BlauerTeddy BlauerTeddy ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.05.2019
Beiträge: 2
Entwicklungsumgebung: Visual Studio 2019 / Win10
Herkunft: Österreich

Themenstarter Thema begonnen von BlauerTeddy

BlauerTeddy ist offline

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

Ich glaube es dank deiner Hilfe gelöst zu haben! :)

C#-Code:
{
    public partial class Window1 : Window
    {
        Helden Marco = new Helden();
        Helden Tobias = new Helden();


        public Window1()
        {
            InitializeComponent();

            Marco.alter=40;
            Marco.name="Marco";
            Tobias.alter=38;
            Tobias.name="Tobias";
        }

        void button1_Click(object sender, RoutedEventArgs e)
        {
            string Ergebnis = ""+Marco.alter;
            TextBox1.Text = Ergebnis;
        }
    }
}

Es scheint als läge die Lösung darin die Objekte in der äußersten geschweiften Klammer zu erzeugen.
Die Eigenschaften dürfen dann aber erst später behandelt werden. Sonst kommts wie bei mir so oft zu Fehlermeldungen.
Allerdings dachte ich schon öfter ich hätte es gelöst. :D

Ist das ein passender Weg? Oder bringt dieses Vorgehen später andere Probleme?
03.05.2019 08:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.968
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

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

Zitat von BlauerTeddy:
Es scheint als läge die Lösung darin die Objekte in der äußersten geschweiften Klammer zu erzeugen.

Nein, mit der Erzeugung hat das nichts zu tun. Du hast zwei unterschiedliche Arten von Variablen erzeugt. Im ersten Versuch - der mit dem Fehler - handelt es sich um eine lokale Variable. Diese ist nur innerhalb der Methode verfügbar, in der sie deklariert, erzeugt und gefüllt wurde.

Im zweiten Versuch jetzt hast du eine sogenannte Instanzvariable (auch: "Feld") erzeugt. Deine Klasse "Window1" hat jetzt zwei Felder "Marco" und "Thomas". Diese beiden Felder sind innerhalb der Klasse überall bekannt. Du kannst sie an jeder Stelle erzeugen (mit "new"). Eine übliche Stelle wäre der Konstruktor der Klasse, eine zweite übliche Stelle wäre dort, wo du es gemacht hast (gleich bei der Deklaration).

Instanzvariablen solltest du mit Zugriffsmodifikatoren versehen. Diese regeln, der alles auf sie zugreifen darf. "private" heisst: nur innerhalb der Klasse. Bei der Namensvergabe für private Felder wird häufig ein _ dem kleingeschriebenen Namen vorangestellt. Siehe auch  [Artikel] C#: Richtlinien für die Namensvergabe .

C#-Code:
public class Window1 : Window
{
    private Helden _marco;
    private Helden _tobias = new Helden();
    private Helden _robin; //nur Deklaration ("Bekanntmachung"), kein Erzeugen ("Instanziierung")

    public Window1()
    {
         this._marco = new Helden(); //Variante über Konstruktor. "this" kann auch weggelassen werden, es zeigt an, dass es sich um Element der Klasse handelt.
         _marco.Alter = 40;
         _marco.Name = "Marco";
         _tobias.Alter = 20;
         _robin.Alter = 24; //Fehler: Robin wurde noch nicht erzeugt!
         _robin = new Helden();
    }
}

Das sind allerdings sehr grundlegende Grundlagen in der OOP, nicht einmal spezifisch für C#, sondern so (oder fast so) auch gültig in jeder anderen objektorientierten Hochsprache.

Wäre ein guter Zeitpunkt, um mal ein Buch zur Hand zu nehmen :).

LaTino

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am 03.05.2019 13:55.

03.05.2019 13:54 E-Mail | 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 | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 16.07.2019 21:09