2011-11-15 5 views
7

이 질문의 익숙하지 않은 특성에 사과드립니다. 간단한 대답이 있다면 설명에 대한 링크 만 있으면 나를 행복하게 해 줄 것입니다.왜 정적 메서드를 클래스에 래핑해야합니까?

프로그래밍을 6 개월 수행 한 후에 정적 클래스가 여러 클래스에 적용되는 루틴을 저장하는 데 다소 유용하다는 것을 발견했습니다. 여기에 내가 정적 클래스를 사용하는 방법의 단순화 된 예입니다, 내 질문은 다양한 것들을

public static class TextProcessor 
{ 
    public static string[] GetWords(string sentence) 
    { 
     return sentence.Split(' '); 
    } 

    public static int CountLetters(string sentence) 
    { 
     return sentence.Length; 
    } 

    public static int CountWords(string sentence) 
    { 
     return GetWords(sentence).Length; 
    } 
} 

에 텍스트를 구문 분석하기위한 클래스입니다 그리고

class Program 
{ 
    static void Main(string[] args) 
    { 
     string mysentence = "hello there stackoverflow."; 
     Console.WriteLine("mysentence has {0} words in it, fascinating huh??", TextProcessor.CountWords(mysentence)); 

     Console.ReadLine(); 
    } 
} 

같은 명백한 가지 방법으로 사용이 필요한 이유 이러한 정적 메서드를 정적 클래스로 래핑하려면? 아무런 도움이되지 않는 것 같습니다. 클래스에 래핑되지 않고이 메서드를 자체적으로 가질 수있는 방법이 있습니까? 나는 캡슐화가 유익하다는 것을 알고 있지만 정적 클래스에 래핑 된 정적 메서드에 대해서는 사용하지 않습니다. 문학적으로 또는 다른면에서 내가 빠진 것이 있습니까? 어리석은 나무를 완전히 짖고 있습니까? 너무 많이 생각하고 있니?

+0

위대한 질문이지만, "자바가했기 때문에"지루한 것 같습니다. – Jacob

+0

궁극적으로 언어가 어떻게 설계되었는지에 달려 있습니다. 모든 메소드는 클래스에 있어야합니다. 왜? 일관성을 위해서 일 겁니다. –

+0

확인이 [포스트] [1] [1] : http://stackoverflow.com/questions/7933540/c-sharp-static-class-why-use – xgencoder

답변

6

C#에서 모든 메서드는 클래스 내에서 선언되어야합니다. 그것은 언어가 어떻게 지정되었는지입니다.

는 정적 클래스는 클래스에 비해 akin to a module 실제로 더, 그래서 나도 당신이 중 하나를 수 있어야한다고 생각 :

  • 이 클래스 또는 외부 함수를 정의;
  • 수입 모듈이 (using와) 네임 스페이스를 가져 같은 방법으로

은 VB.NET, F # 및 Nemerle는 실제로 당신이 모듈을 선언하고 가져올 수 있습니다; 당신이 그들의 방법을 자격이없는 것을 사용할 수있게 해주는 것.

이 유효 Nemerle입니다 :

또한
using System.Console; // import static methods in the Console class 
class Hello { 
    static Main() : void { 
    WriteLine("Hello, world!"); // unqualified access! 
    } 
} 

extension methods에서 살펴보고, 그들은 당신이 다른 방법으로 "해결"할 수 있습니다. TextProcessor의 메소드는 이고string 확장 메소드입니다.

+1

그레이트, Nemerle 재미 보인다. 모듈은 C#에서 환상적입니다. –

-3

정적 메서드는 런타임에 만들어지는 클래스의 단일 인스턴스에서 호출되는 메서드입니다.

1

랜덤 네임 스페이스에서 방금 매달려있는 메서드를 사용하는 것은 다소 어색합니다.

답변은 "범위"를 제공하는 것입니다. 메소드가 정적이기 때문에 스코프가 없다는 것을 의미하지는 않습니다. 다른 정적 private 메소드 나 멤버 변수에 계속 액세스 할 수 있습니다. 클래스는 이러한 것들이 살기위한 "home"을 제공합니다.

정적 클래스는 정적 메소드가 처음 사용될 때 호출되는 정적 생성자를 가질 수도 있습니다. 그래서 이것은 필요에 따라 물건을 설정할 수있는 능력을 제공합니다.

기술적 인 한계로 인해 조직 설계가 필요합니다.

+2

"임의의 네임 스페이스에서 방금 매달려있는 메서드를 사용하는 것은 다소 어색합니다." - * 대부분의 * 언어가 그렇게합니다. – jjnguy

+0

대부분의 객체 지향 언어는 무엇입니까? –

+0

알겠습니다. 따라서 C++과 같은 "하이브리드"언어에서는 클래스 외부의 함수에 액세스 할 수 있지만 C#과 같은 엄격한 OO 언어에서는 클래스 내부의 모든 것을 캡슐화해야합니까? .. 말이된다. 필자가 생각하는 것보다 훨씬 많은 상용구 코드를 만든다. –

-1

이미이 주제에는 충분한 정보가있는 많은 스레드가 있습니다 ...당신은 하나를 찾을 수 있습니다 here..

2

This post by eric lippert 꽤 상세한 설명을 제공합니다. 이 사람 "에릭"이 그가 무엇에 관해 이야기하는지 알지는 못하지만 ;-)

+0

권자. 감사. 네, 에릭은 얼간이입니다 ^^ –

관련 문제