2013-11-20 3 views
1

제 생각에 정적 인 유일한 목적은 메소드가 인스턴스가 아닌 클래스 자체에서 호출되도록하는 것입니다. 그러나 메소드가 비공개 인 경우 클래스 내에서 메소드를 호출 할 수 있습니다. 그래서 뭔가를 개인적이고 정적으로 선언 할 이유가 있습니까? ReSharper는 많은 방법들을 정적으로 만들 것을 권장하며 개인적인 것에 대해서는 요점을 보지 못합니다.전용 메서드를 정적으로 만드는 이유는 무엇입니까?

답변

2

예 (public 또는 무엇이든) static 메서드가 있고이 메서드는 private 메서드를 사용해야합니다. 그것이 static이 아니라면 작동하지 않습니다.

public static void Foo1() 
{ 
    Foo2(); // compile time error 
} 

private void Foo2() 
{ 

} 

메서드는 정적이 아닌 속성 (예 : 상속과 같은)을 사용해야하는 경우에만 인스턴스 메서드 여야합니다. 따라서 정적으로 만드는 것이 가장 좋습니다.

+0

나는 모두가 내 질문에 대답한다고 말하고 싶지만 이것은 개인적인 방법을 정적으로 만드는 가장 실질적인 이유 인 것 같아서 대답으로 받아 들일 것입니다. – sab669

1

성능. 그것은 (마이크로) 최적화입니다. CLR은 실행해야하는 메서드를 찾기 위해 더 적은 단계를 수행해야합니다. 자세한 설명

: 정적 메소드를 호출 인스턴스 메소드 호출 반면, 마이크로 소프트 중간 언어 (MSIL)에서 호출 명령을 발생 http://msdn.microsoft.com/en-us/library/79b3xss3.aspx

는 callvirt 명령을 발생시키는 또한 null 객체 참조를 확인합니다. 그러나 대부분의 경우 성능 차이는 두 가지 사이에 큰 차이가 없습니다 .

0

개체의 상태를 사용하지 않고 구현 세부 사항이있는 메서드가 작성되는 경우이 경향이 있습니다. 그냥 private으로 만들 수도 있지만 일부 사람들은 메서드가 상태에 닿지 않는다는 것을 완전히 나타내려면 static으로 만들 것을 선호합니다.

개인적으로 나는 단지 private으로 갈 것입니다.

1

개인 메서드가 인스턴스 메서드 또는 필드 또는 속성을 사용하지 않는 경우 정적으로 표시하는 것이 좋습니다.

이렇게하면 IL에서 방출 된 call 연산 코드를 얻습니다.이 opcode는 메서드를 호출하기 전에 "null 검사"를 수행하지 않습니다. 인스턴스 메소드가 callvirt opcode를 내보내고 메서드를 호출하기 전에 "null checking"을 수행합니다. 이를 통해 성능 이점을 얻을 수 있습니다.

관련 문제