2017-05-07 1 views
0

현재 저는 독일어 책 "Schrödinger Programmiert C#"을 사용하여 C# 언어로 프로그래밍하고 있으며 코드 예제가 156 페이지에 있습니다. 문제는 다음과 같습니다. 왜 두 번째 방법에서는 정적을 사용하지만 첫 번째 방법에서는 정적을 사용하지 않는지 이해할 수 없습니다.정적 메서드와 개체의 비 정적 메서드 간의 차이점

기본 방법

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

에서

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; 
    } 
} 

Person 클래스 나 차이를 이해하는 데 도움주세요!

+0

WalkedKm은 호출 된 클래스 인스턴스의 상태 (this.Footsteps)에 액세스해야하므로 static으로 선언되지 않습니다. AverageWalkedKm은 클래스 내에 저장된 상태를 사용하지 않으므로 정적 일 수 있습니다. 정적 (Static)은 첨부 된 클래스의 인스턴스를 만들거나 내부 논리와 느슨하게 결합 된 메서드로 복잡하게 만들 필요가 없으므로 선호되는 것으로 간주됩니다. –

답변

0

float AverageWalkedKm(Person[] persons)이 정적 일 수있는 정적되지 않습니다 발자취 변수를 사용하기 때문에.

void Walk (int Footsteps)인스턴스에 액세스하므로 정적 일 수 없습니다. (즉, Footsteps 속성)

참고 : 인스턴스 members = non-static member.

편집

그래서, 당신은 AverageWalkedKm()Person[] persons 매개 변수 데이터 형식 Person의 것을 반대, 그래서 그것이 인스턴스 멤버에 액세스하는 것을 당신에게 보인다.

음, 예, 인스턴스 멤버에 액세스하고 있지만 자체 인스턴스는이 아닙니다. 작동하는 인스턴스가 제공됩니다. 따라서이 메소드는 완전히 다른 클래스에 속할 수 있으며 호출 할 Person의 인스턴스가 주어지기 때문에 변경되지 않고 계속 작동합니다. 인스턴스 메서드가 인스턴스 멤버에 액세스 할 수 있다고 말하면 자체 인스턴스 (this.member) 또는 심지어 this. (선택 사항이므로)을 의미합니다.

+0

문장을 다음과 같이 수정해야합니다 : _ "정체가 아닌 클래스의 모든 멤버 필드, 속성 또는 메소드"_ 또는 "특정 인스턴스에 속하지 않는 _"또는 이와 유사한 태그. –

+0

@MassimilianoKraus 글쎄, 네 말이 맞아. –

+0

좋습니다. 그러나 AverageWalkedKm 메서드 매개 변수 ** Person [] persons **에는 "Person"데이터 유형이있는 배열이 있으며 인스턴스 멤버에 액세스하려고 시도하지 않습니까? –

0

당신이 클래스의 예를 멤버 (필드, 속성 또는 메서드)에 액세스하려고 시도하지 않기 때문에

0

정적 메서드는 클래스의 개체 인스턴스가 필요하지 않거나 필요하지 않을 때 사용합니다. 위의 예제에서 Person 클래스의 객체 인스턴스를 만들 었는지 여부에 관계없이 Person.AverageWalkedKm 메서드를 호출 할 수 있습니다. 그러나 Walk 메서드는 인스턴스 변수 (Footsteps)를 참조하기 때문에 정적 일 수 없습니다. 먼저 Person 클래스의 인스턴스 (예 : p1 및 p2)를 만든 다음 해당 인스턴스를 사용하여 Walk 메서드를 호출해야합니다 .

관련 문제