2012-04-05 3 views
13

정적 메서드를 사용하는 정적이 아닌 클래스와 정적 클래스를 사용하는 것의 일반적인 이점 또는 단점은 무엇입니까? 같은 정적 메서드 이외의 확장 메서드로 비 정적 클래스에서 정적 메서드를 사용할 수 없다는 사실. 이 대저수준 차이 : 정적 메서드를 사용하는 정적 클래스와 정적 메서드를 사용하는 정적 클래스

class NonStaticClass 
{ 
    public static string GetData() 
    { 
     return "This was invoked from a non-static class."; 
    } 
} 

: 예를 들어

static class StaticClass 
{ 
    public static string GetData() 
    { 
     return "This was invoked from a static class."; 
    } 
} 

어떤 다른 통해 하나의 방법을 사용하여 성능/메모리 의미는 무엇입니까?

참고 : 클래스를 인스턴스화 할 필요가 없다고 가정합니다. 내 사용의 시나리오는 이런 식으로 제한됩니다

Console.WriteLine(NonStaticClass.GetData()); 
Console.WriteLine(StaticClass.GetData()); 

답변

16

클래스를 정적으로 만들면 컴파일러는 클래스에 정적 멤버 만 있는지 확인합니다.

코드를 읽는 사람이라면 즉시 클래스를 인스턴스화 할 수 없으며 클래스의 인스턴스와 관련하여 상호 작용할 필요가 없습니다. 왜냐하면 어떤 것도 존재할 수 없기 때문입니다.

clr 수준에서는 static의 개념이 없습니다. 정적 클래스는 abstractsealed이므로 상속 및 인스턴스화를 효과적으로 방지합니다.

성능 측면에서 볼 때 컴파일러 나 런타임이 서로를 최적화 할 수있는 가능성은 없습니다.

이 예제에서는 가능한 한 독자에게 명확한 의도를 표현하는 데 중점을 둡니다. 나중에 언제든지 최적화 할 수 있습니다.

3

몇 가지 특질/제한이 있습니다

  • 인스턴스화 할 수없는 정적 클래스
  • 정적 클래스
  • 을 상속 할 수 없습니다

그래서 당신이 클래스 (헬퍼/유틸리티 또는 확장 메서드 컨테이너)에 대한 그런 행동을 가정한다면, 사용을 제한하려면 - static으로 만드십시오.

+0

사용 사례 시나리오에 대한 편집 된 게시물 확인 - 일반적으로 인스턴스화없이 사용하면 어떤 차이가 있는지 궁금합니다. –

+0

게시물을 업데이트했습니다. –

+4

언급 한 점 외에도 로컬 변수, 필드 또는 형식 매개 변수의 유형으로 정적 클래스를 사용할 수 없습니다. 배열의 요소 유형으로 사용할 수 없습니다. 제네릭 형식 인수 목록에서 형식 인수로 사용할 수 없습니다. –

2

성능에 미치는 영향 : 기본적으로 없음.

NonStaticClass의 인스턴스를 만들 수 있지만 정적이 아닌 오버라이드 메서드가 없으므로 object obj = new object()을 말하는 것만 큼 유용합니다. 즉, 아마도 잠금에 유용하며 그게 전부입니다. 클래스를 정적으로 만들면 다른 사람을 막을 수 없지만 실제로는 그렇지 않습니다. 입니다.

클래스의 인스턴스를 만들 이유가 없다고 말하는 자체 문서화 방법입니다.

3

장점이나 단점이 없습니다. 그것은 단지 구조적인 결정입니다.

함수 세트 나 함수 libreary를 제공하는 경우 정적 클래스 만 사용하십시오. 인스턴스를 생성 할 수 없으므로 사용할 수 있습니다.

MyMathLibrary.Plot(...) 

이 유형은 일반적으로 상태 적은 행동을 의미한다. 반복, 보통. 정적 멤버와

를 사용하여 간단한 클래스 당신이 "정상"형식을 가지고 있지만, 예를 들어 같은, 어떻게 든 방법이 필요합니다

public class MyType 
{ 
    .... //some members 

    public static MyType ReadFromXml(XmlReader reader) {} 
    public static void SaveToXml(MyType mt) {} 
} 

그것은 건축가의 단지 문제, 더 은색 총알이 없습니다 선택.

+0

@Dennis Delimarsky : "내 유스 케이스 시나리오는 ...과 같이 제한되어 있습니다."라고하는 이유는 무엇입니까? * 제한 사항처럼 보이지 않습니다. 귀하의 아키텍처에 따라 API의 동작을 명백하게함으로써 * 정말 좋은 디자인 선택이 될 수 있습니다. – Tigran

+0

이것은 실제로 클래스를 인스턴스화하지 않으려 고 시도한 샘플입니다. –

관련 문제