2009-05-18 4 views
2

C++ 프로그래머이므로 C#으로 작업 할 때마다 왜 프리 스탠딩 함수에 대한 지원이 부족한 지 궁금합니다. 다른 말로하면 : 어떤 클래스의 일부가 아닌 함수. 독립 실행 형 함수는 완전 개인 액세스를 요구하지 않고 클래스에 기능을 추가 할 수 있기 때문에이 기능을 놓치고 관리하기 힘든 모노리스 클래스를 피할 수 있습니다. 또한 타사 라이브러리를 확장 할 수 있습니다. 나는 당신이 정적 클래스를 사용할 수 있다는 것을 알고 있지만 클래스 이름은 완전히 부적절하므로 클라이언트 코드를 불필요하게 장황하게 만든다.C# 프리 스탠딩 함수

예를 들면. 문자열의 단어를 집계하는 도우미 함수를 만들고 싶습니다. 어떻게하면 "StringHelperClass.CountWords();"를 쓰지 않아도됩니까? 클라이언트 코드에서? StringHelperClass는 네임 스페이스 역할을하므로 "StringHelperClass;를 사용하여 작성할 수 없습니다." 모든 사용법에 따라 "StringHelperClass"를 반복해야하지만 문자열 매개 변수가 문자열이기 때문에 문자열 도우미 함수임을 분명히합니다.

클라이언트 코드를 간결하게 유지하면서 클래스의 기능을 확장하는 방법이 있습니까?

+0

그래, 나는 여기서 질문의 증거를 볼 수 없다. – Noldorin

+1

나는 "진짜 질문이 아니다"라고 결론 지었다. –

+0

클래스 외부의 메소드는 객체 지향 언어로 어떤 의미를 갖습니까? – annakata

답변

2

나는 이것이 C#에서 부족하다는 것을 발견했다. 주된 이유는 함수 사용에 대한 자세한 내용입니다. 클래스 이름은 네임 스페이스 역할을하지만 코드 파일의 시작 부분에서 네임 스페이스를 단순히 '사용'할 수는 없습니다. 예를 들어, C#에서 OpenGL을 작성하려면 다음과 같이 입력해야합니다. OpenGL.glClearDepth (1.0f); OpenGL.glEnable (GL_DEPTH_TEST) ;, 등등. 나는 모든 것을 수업으로 만드는 기본 개념과 관련이 있을지도 모른다는 것을 알고 있지만, 나는 당신이 어떤 방식으로 일을하도록 강요하는 언어를 정말로 좋아하지 않는다. 물론 내가 다른 선택의 여지가 없다면 C#을 사용하지 않는 이유 일 수 있습니다.

+1

아마도 이러한 메소드 이름의 중복 이름은 OpenGL.ClearDepth (1.0f) 일 수 있습니다. 물론 여러분이 별칭 선언을 사용하고 싶다면'GL.ClearDepth (1.0f)'- 내가 언급 한 모든 장점을 여전히 가지고 있습니다 ("."공격을 발견하지 못한다면). –

11

더 좋은 질문은 다음과 같습니다.

"왜 포함해야합니까?"

C#이 프리 스탠딩 기능없이 잘 결합되어 있다고 가정 할 때,이를 추가하는 데 필요한 요구 사항은 무엇입니까? 특히, 정적 유틸리티 클래스는 (정규 또는 확장 메소드와 같은) 호스팅을 위해 잘 작동하며, 충돌이 발생할 경우 단순한 모호성 제거를 허용합니다. (OregonGhost이 코멘트에 노트로)

그것은 죽음으로-인텔리 방지 코드를 모듈화하는 데 도움 등

그래서 왜 추가? 이미 해결되지 않은 문제점 (C#)은 무엇입니까?

+3

그건 사실입니다. IMO 정적 유틸리티 클래스는 실제로 코드에 값을 추가합니다. 코드를 모듈화해야하기 때문에 항상 좋은 가치가 있습니다. 물론, 이는 오용 될 수 있지만 Free-Floating 함수에서도 마찬가지입니다. 아, 확장 방법을 사용하면 더 나은 결과를 얻을 수 있습니다. 예를 들어 문자열 함수를 문자열 클래스에 추가 할 수있는 이유는 무엇입니까? :) – OregonGhost