2017-05-07 14 views
0

Ich lerne gerade in der Programmiersprache C# mit dem deutschen Buch "Schrödinger Programmiert C#" zu programmieren und auf der Seite 156 gibt es ein Codebeispiel. Das Problem ist: Ich verstehe nicht, warum ich eine statische Methode in der zweiten Methode verwende, aber nicht in der ersten.Unterschied zwischen statischen Methoden und nicht statischen Methoden im Objekt

Klasse Person

class Person 
{ 
    public string Name { get; set; } 
    public float WalkedKm 
    { 
     get 
     { 
      return this.Footsteps * 0.75f/1000.0f; 
     } 
    } 
    public float Weight { get; set; } 
    public int Footsteps { get; private set; } 

    public void Walk (int Footsteps) 
    { 
     if (Footsteps > -1) 
      this.Footsteps += Footsteps; 
    } 

    public static float AverageWalkedKm(Person[] persons) 
    { 
     int amount = persons.Length; 
     float walkSum = 0; 
     foreach (Person p in persons) 
      walkSum += p.WalkedKm; 
     return walkSum/(float)amount; 
    } 
} 

in der Methode Main

Person p1 = new Person(); 
Person p2 = new Person(); 
p1.Name = "Schrödinger"; 
p2.Name = "Schrödingers Girlfriend"; 
p1.Walk(1500); 
p2.Walk(1500); 
p2.Walk(2100); 
Person[] person = new Person[] { p1, p2 }; 
Console.WriteLine("Schrödingers steps: {0}. km {1}", p1.Footsteps, p1.WalkedKm); 
Console.WriteLine("Her steps: {0}. km {1}", p2.Footsteps, p2.WalkedKm); 
float average = Person.AverageWalkedKm(person); 
Console.WriteLine("Average: {0}km", average); 
Console.ReadKey(); 

Bitte helfen Sie mir den Unterschied zu verstehen!

+0

WalkedKm wird nicht als statisch deklariert, da es auf den Status (this.Footsteps) der Instanz der Klasse zugreifen muss, über die es aufgerufen wird. AverageWalkedKm kann statisch sein, da es keinen in der Klasse gespeicherten Status verwendet. Ein Static wird als bevorzugt angesehen, da Sie keine Instanz der Klasse erstellen müssen, mit der er verbunden ist, oder ihn mit Methoden überladen, die nur lose mit seiner internen Logik verbunden sind. –

Antwort

0

float AverageWalkedKm(Person[] persons) statisch sein kann, weil es keine Instanz Mitglieder (Felder, Eigenschaften oder Methoden) der Klasse zuzugreifen nicht versuchen.

void Walk (int Footsteps) kann nicht statisch sein, weil es auf Instanz Mitglieder der Klasse zugreifen kann. (Nämlich die Footsteps Eigenschaft.)

Hinweis: Instanz Mitglieder = nicht statische Mitglieder.

EDIT

So Objekt Sie, dass in der AverageWalkedKm() der Person[] persons Parameter Datentyp ist Person, so scheint es, dass es beispielsweise Mitglieder zugreift.

Nun ja, es ist beispielsweise Mitglieder zugreifen, aber nicht seiner eigenen Instanz. Es wird die Instanzen gegeben, mit denen es arbeitet. Diese Methode könnte also zu einer ganz anderen Klasse gehören und würde immer noch unverändert funktionieren, da Instanzen von Person aufgerufen werden. Wenn wir sagen, dass eine Instanzmethode auf Instanzmitglieder zugreifen kann, meinen wir der eigenen Instanz, wie in this.member oder sogar ohne this., wie es optional ist.

+0

Sie sollten Ihren Satz korrigieren mit: _ "alle Mitgliedsfelder, Eigenschaften oder Methoden der Klasse, die nicht STATISCH ist" _ oder _ "DAS NICHT ZU EINER BESONDEREN INSTANZ" _ oder ähnlichem gehört. –

+0

@MassimilianoKraus gut, du hast Recht. –

+0

Okay. Aber in den AverageWalkedKm-Methode Parametern ** Person [] Personen ** gibt es ein Array mit dem Datentyp "Person", ist das nicht versucht, auf Instanzmitglieder zuzugreifen? –

0

Da Sie die Schritte Variable verwenden, die nicht statisch ist

0

Sie verwenden statische Methoden, wenn Sie keine Objektinstanz der Klasse benötigen (oder wollen). In Ihrem Beispiel können Sie die Person.AverageWalkedKm-Methode aufrufen, unabhängig davon, ob Sie eine Objektinstanz der Person-Klasse erstellt haben oder nicht. Da die Walk-Methode jedoch auf eine Instanzvariable (Footsteps) verweist, kann sie nicht statisch sein: Sie müssen zuerst eine Instanz der Person-Klasse erstellen (p1 und p2 in Ihrem Beispiel) und diese Instanzen dann verwenden, um die Walk-Methode aufzurufen .

Verwandte Themen