2012-02-20 3 views
3

클래스의 인스턴스 대신 C#에서 로컬로 클래스를 참조 할 수 있습니까?C# 인스턴스 참조와 반대되는 클래스 참조

void someFunc() 
{ 
    var a = System.Math; 
    var b = a.Abs(4); 
} 

편집 : 같은 다음 코드는 예를 들어, 컴파일이 아닌 것, 뭔가가 System.Math 클래스 아니에요과 실제 프로그램에서 나는 클래스를 구성하고 구축 된 값을 반환 꿔 . 나는 원래 수업을 사용하기를 원하는 맥락이 관련성이 없다고 생각하지 않았으며 아마도 그렇게해서는 안된다.

Anastasiosyal은 지역 대표를 사용하여 흥미로운 아이디어를 가지고 있습니다.

+1

네, 할 수 있습니다. 그런데 왜 그걸하고 싶습니까? – AlwaysAProgrammer

+2

그러면 어떻게됩니까? – alan2here

+1

이것이 도움이 될 것이라고 생각하는 문제는 무엇입니까? –

답변

3

변수에 정적 클래스 값을 할당 할 수 없습니다. 질문이 인 이유이 작업을 원하십니까? 문제를 해결할 수있는 다른 방법이있을 수 있습니다.

예 : 델리게이트를 사용하여 수행 할 작업을 할당 할 수 있습니다.

Func<int,int> operation = Math.Abs; 
// then you could use it like so: 
int processedValue = operation(-1); 
+0

내 생각에 연산은 구조와 반환이지만 수학 클래스는 예제 일 뿐이지 만 이상적인 인수 목록이 더 이상있는 것은 아니지만 흥미로운 아이디어는 작동 할 수 있으며 지금까지 최고의 솔루션이 될 수 있습니다. 의 중복 된 설명으로 끝내고 싶다. 동일한 방법으로 달성 할 수있는 대체 방법이 어떻게 내 원래의 접근 방식을 잘못 만들었는지를 알 수는 없지만 C#에서는 사용할 수 없습니다. – alan2here

+0

생성 패턴을 찾고 있다면 [Here] (http : // stackoverflow.)에 설명 된대로 공장 패턴 또는 [Inversion of Control] (http://en.wikipedia.org/wiki/Inversion_of_control)의 이점을 얻을 수 있습니다. com/questions/2515124/whats-the-simpleest-ioc-container-for-c) – Anastasiosyal

+0

이것은 필자가 필요로하고있는 것에 가장 가깝고 지연된 것에 대해 유감스럽게 표시했다. – alan2here

2

C#에서는 유형이라고합니다. 그리고 다음과 같이 지정할 수 있습니다.

Type a = typeof(SomeClass); 

그러나 사용하려면 인스턴스를 만들어야합니다. 내가 뭘 믿고 정적 가져 오기 자바,하지만 불행히도, 그들은 C#에 존재하지 않습니다.

짧은 대답 : 위와 다른 것 같습니다. 코드를 그냥 단축 (및 이럴 당황하게) 할 경우

// Wont compile: 
math.Abs(5); 

:

8

는 클래스 참조 할 수 있습니다

Type math = typeof(System.Math); 

를하지만 일반 도트 구문을 사용하여 정적 메서드를 호출 할 수 없습니다 할 수 있습니다 reference classes with aliases via a using directive :

// Untested, but should work 
namespace MyUnreadableCode { 
    using m = System.Math; 
    class Foo { 
     public static Int32 Absolut(Int32 a) { 
      return m.Abs(a); 
     } 
    } 
} 
+0

C# 4에서는 새로운'dynamic' 키워드를 사용하여'Type' 객체에 정적 메서드를 호출 할 수 있습니다. 몇 가지 추가 배관 공사가 필요합니다 (예쁜 것은 아닙니다). 그러나 작동합니다. ([출처] (http://blogs.msdn.com/b/davidebb/archive/2009/10/23/using-c-dynamic-to-cal-static-members.aspx)) –

+1

@ M.Babcock 감사합니다. 이제는 내 눈알을 씻어야합니다 :-) –

+0

타입 접근 방식은 정적 메소드 호출을 허용하지 않으며, 난독 화가 많이 발생하지 않는 것으로 보이고 네임 스페이스 접근법은 허용하지 않습니다. using 문은 매우 로컬인데,이 경우에 사용할 수있는 최선일 수 있습니다. 나는 일반적으로 "사용"에 대한 팬이 아닙니다. 예를 들어, "시스템"을 시작하는 것과 같은 네임 스페이스 계층 구조를 만들기 위해 맨 위에 "사용"하는 긴 목록이 마음에 들지 않습니다. – alan2here

0

아니요인스턴스 메소드가 원래 유형의 정적 메소드에 바인드하는 값으로. 이를 위해서는 원래의 타입으로 메소드 호출을 전달하는 새로운 타입을 생성해야합니다.

class MyMath { 
    public int Abs(int i) { 
    return Math.Abs(i); 
    } 
} 

var x = new MyMath(); 
+0

아마도 상속을 사용하여 예제를 향상시킬 수 있습니다. MyMath는 System.Maths에서 상속받습니다. – alan2here

+0

@ alan2here 그 점이 개선되는 이유는 무엇입니까? – JaredPar

+0

그러면 MyMath는 전달 기능이 하나만있는 대신 System.Math와 동일하기 때문입니다. – alan2here

1

제가 알고 있듯이 짧은 이름으로 수업을 참조해야합니까? (문 섹션을 사용하여 내부 파일의 상단에)이 시도 :

using m = System.Math; 

을 나중에 코드에서 :

m.Abs(...) 

말이?

+0

Chris Shain의 대답에 대한 내 의견보기. 이상적이지는 않지만 충분히 좋을 수도 있습니다. – alan2here

2

C# 6.0에서는 문제를 해결할 수있는 static import feature이 도입되었습니다.

using static System.Math; 

class MyProgram 
{ 
    static void Main(string[] args) 
    { 
     var b = Abs(4); // No need to specify the name of Math class 
    } 
} 
관련 문제