2010-02-11 3 views
21

C#에서 정적 클래스를 표시하는 목적은 무엇입니까?C#에서는 정적 클래스를 표시하는 목적은 무엇입니까?

정적 메서드 만있는 클래스가 있으면 클래스를 정적으로 표시하거나 표시하지 않을 수 있습니다. 클래스를 정적으로 표시하려는 이유는 무엇입니까? 모든 메소드가 정적이라면 클래스를 정적으로 표시하고, 비 정적 메소드를 추가하지 않을 계획입니까?

나는 비슷한 문제를 둘러 보았지만 이와 비슷한 것은 없었습니다.

+0

http://stackoverflow.com/questions/576853/what-is-the-use-of-a-static-class http://stackoverflow.com/questions/241339/when-to-use-static- classes-in-c –

+0

@ dboarman 자신 만의 질문을하십시오! – Cheeso

+0

걱정하지 마시고, 당신의 질문을 오염시키고 싶지는 않을 것입니다. 누군가 정적 멤버의 스레드 안전성에 대해 언급 할 수 있다고 생각했습니다. ;) – IAbstract

답변

26

클래스를 정적으로 표시하는 것은이 유형이 정적 및 const 멤버 만 갖도록하려는 선언문입니다. 이것은 컴파일러에 의해 시행되며 실수로 인스턴스 메소드를 유형에 추가하는 것을 방지합니다.

다른 장점

  • 확장 방법은
  • 는 일반적인 인수로 유형의 사용을 방지 클래스의 인스턴스 생성하지 못하도록 정적 클래스에서 정의 할 수 있습니다 (감사 에릭!)
+8

또한 소비자가 클래스의 인스턴스를 만들지 못하게합니다. 정적 클래스가 도입되기 전에이를 강제하기 위해 private 인자없는 생성자를 생성해야했습니다. –

+0

@Joel, thanks with this – JaredPar

+6

덧붙여서 클래스를 정적으로 만들면 제네릭 클래스, 구조체, 인터페이스, 위임 또는 메서드에서 제네릭 형식 인수로 해당 형식을 사용할 수 없습니다. (generic 형식 인수와 같은 형식으로 무엇을 할 것인가? 만들 수는 없으므로 해당 형식의 변수는 null이 아닙니다. 형식 매개 변수를 통해 정적 메서드를 호출 할 수 없습니다. 전혀 쓸모가 없어서 우리는 그것을 허용하지 않습니다.) –

6

확장 메서드를 작성하려면 정적 클래스를 사용해야합니다. 그렇지 않으면 클래스가 인스턴스 데이터를 전혀 가지지 않을 것임을 보여줍니다.

1

클래스에 정적으로 표시하려면 정적 메서드 (일반적인 도우미 클래스) 만 포함하도록합니다. 인스턴스 메소드를 넣으면 컴파일러가 불평 할 것입니다. 버전 1의 .NET 프레임 워크에는 클래스가 있었지만 정적 메서드 만 함께 제공되는 것을 기억하지 않았습니다. 우연히 그러한 메소드 중 하나가 정적 수정자를 얻지 못했습니다. 이 기능은 버그가 배송 후 매우 늦게 발견 된 당시 존재하지 않았기 때문에. 그들은 생성자를 비공개로 만들었으므로 메서드를 사용할 수 없었습니다.

5

C# 언어에 고유 한 규칙이므로 CLR에는 정적 클래스 개념이 없습니다. 실수로 클래스의 인스턴스 멤버를 추가 할 수 없으며 클래스를 상속 할 수 없으며 클라이언트 코드가 우연히 클래스의 인스턴스를 만들 수 없습니다. 클래스의 기본 TypeAttributes는 Abstract 및 Sealed입니다. Abstract는 새로운 연산자가 작동하지 못하도록 보장합니다. Sealed는 클래스에서 상속받을 수 없도록합니다.

또한 확장 메서드는 정적 클래스의 정적 멤버 여야합니다. VB.NET은 다르게, [Extension] 속성을 필요로합니다.

코드에서 정적 클래스를 사용하는 것은 필요하지 않지만 유용합니다. 계약 내용이 매우 이해하기 쉽기 때문에 코드를 더 쉽게 이해할 수 있습니다. 그러나 OOP 코드 대신 절차 코드를 작성하는 수단으로 사용하지 않도록주의하십시오.

+0

구현 세부 정보 및 절차 코드 작성 과용에 대한 언급은 +1입니다. – si618

7

클래스를 static으로 표시하면 두 가지 중요한 이점이 있습니다.

  • 컴파일러는 static 구성원을 클래스에 넣어야 만한다는 것을 확인합니다.

  • 이 클래스는 static 멤버의 컨테이너 일뿐입니다.

이 기능은 NDP v1.0의 버그 (a un-callable non-static member was included in the System.Environment class)에 대한 응답으로 고안되었습니다.

+0

다음과 같은 : 나는 모든 필드가'readonly '로 표시되고'readonly'라고 표시된 타입이어야한다는 형식의 비슷한'readonly' 수정자를 원했습니다. 이에 따라 NDP에 주석을 달아야하는데, 특히 원시적 인 유형이다. 불행하게도 변경 가능한 관용구로 작성된 코드가 많습니다 (예 :'List '). 너무 늦었습니다. –

관련 문제