2012-12-12 3 views
0

나는 반사의 사용을 자제하도록 권고 받았다. 나는 진짜로 알고 싶었다. 반사 때문이다 비싼? 그렇지 않은 경우 사용하지 않는 이유는 무엇입니까?System.Reflection이 클래스 멤버 데이터/정보에 액세스하는 방식은 무엇입니까?

나의 현재 및 미래의 프로젝트는 주어진 클래스 - 회원 정보에 액세스해야 할 수도 있습니다. 필자는 때때로 필드를 열거해야합니다. & 속성 - 값 또는 선언 이름.

그래서 내가 알고 싶은 무엇이다 :

어떻게 반영 작동합니까? 정보에 어떻게 도달합니까? (간단한 설명을 할 것입니다)

왜 응용 프로그램에서 리플렉션을 사용하지 않는 것이 좋습니다? 필요한 정보를 필드 또는 속성 값 또는 이름으로 가져와야 할 경우 System.Reflection을 사용하여 이 아닌을 사용할 수 있습니까?

일부 배경.

현재 프로젝트에서 (예를 들어) 특정 SQL Server 테이블 열 이름 또는 SQL 테이블 이름을 나열하는 것입니다.

다른 방법으로 생각하면 List<strings>으로 반환 될 수 있습니다. 정말 알았다면

이유 또는 방법 "나쁜"이입니다 reflection를 사용하는, 내가 정말 피하고 싶은 경우에 나는 대안을 찾을 수 있습니다로 .. 난 후, 결정을 내릴 수

접근 (이 특정 시나리오에서).

필자가 테이블 이름 목록을 필요로하거나 (데이터를 액세스 할 때) 데이터베이스에 액세스하여 (필자는) 바람직하지 않습니다. 필자가 피해야 할 경우 텍스트 파일이나 XML에 저장하십시오. 반사.

나는 좀 더 우아한 것을 알고있다. 그것은 비록 문제가 아니에요. 이 질문은 폐쇄되었다

을 다시 도와주세요

갱신 (다시 다른 많은 사용 사례가있을 수 있기 때문에 단지 예입니다, 당신은 아마. 알고), 투표는

아래 '다시' 감사 .

+1

리플렉션을 사용하여 SQL 열 목록을 얻는 방법은 무엇입니까? 왜 'select * from INFORMATION_SCHEMA.COLUMNS'입니까? – Blorgbeard

+2

@Blorgbeard. 내가 quetion을 만들어으로, 내 게시물의 끝이 끝까지 읽어 참조하십시오, 당신이 더 잘 이해 할 수 자체 BOLD @Blorgbeard 어떻게 당신이 내가 그것을 열 정체성 1 위의 클래스로 할 수있는 모든 테이블을 갖는했던 생각 했 – LoneXcoder

+2

? 또는 성능 튜닝으로 필요할 때마다 데이터베이스를 방문하라는 제안을 했습니까? – LoneXcoder

답변

6

CLR 어셈블리 (실행 가능 또는 동적 링크 라이브러리)는 일반적으로 유형, 구조, 메소드, 필드, 이름 및 여러 정보에 대한 정보를 의미하는 구조에 대한 메타 데이터를 포함합니다. "언어는 대개 분실되어 오프셋과 크기 정보로 대체되었습니다.

반영하는 강력한 도구입니다 일부 (보통 고급) 일 경우에만 반사를 사용하여 달성 될 수있다. 그러나 프로그램 및 다른 프로그램의 구현에 의존하기 시작하기 때문에 보안 및 캡슐화에 대한 우려가 커지지만 일반적으로 이러한 부분을 피하고 해당 부분의 인터페이스를 신뢰해야합니다. 또 다른 관심사는 성능입니다. 이러한 모든 종류의 정보 (궁극적으로 텍스트 정보)에 액세스하려면 비 반사 방식 (대개 오프셋 및 크기 정보를 사용하는 방식)과 달리 프로그램이 느려지 게됩니다. 예를 들어, 리플렉션을 사용하여 다형성을 다시 구현하고 가상 메소드 테이블을 무시할 수 있습니다. 그러나 후자는 전자보다 몇 배 빠릅니다.

를 사용하여 반사 당신은해야하지만, 당신이하지 않은 경우 사용하지 않는 경우. 매우 강력하고 사람들이 사용하는 것에 대해 조언하는 도구 중 하나입니다. 그러나 실제로하는 일을 실제로 알고있는 경우 사용할 수 있습니다. 즉, 반사 방식을 잘못 사용하면 위의 문제가 제기 될뿐만 아니라 유지 관리하기가 훨씬 수월해집니다.

+2

더하기 사실 유익하기 때문에, 기술적 인 정보의 대부분에 설명되어있는 실마리가 없어도 쉽게 검색 할 핵심 용어를 추출 할 수 있습니다. 고맙습니다 ... 당신이 정말로 깊이 공부 한 것처럼 보입니다. – LoneXcoder

+0

Chatzigiannaki, 어리석은 소리가 날지 모르지만 왼발로 내 하루를 시작하게 만들었습니다. (제 영어 실례 ...) 여기에 손을 줘도 될까요? ** 마지막 업데이트 **를 참조하십시오. – LoneXcoder

2

'반사 사용 안함'처럼 간단하면 반성하지 않을 것입니다.

리플렉션 입니다. 따라서 사용자는 사용법을 신중히 선택해야합니다. 인터페이스, 위임자 등을 사용하여 목표 (성향 주입 및 동적 유형을 염두에두고)를 사용하는 더 나은 솔루션 (설계 및 성능면에서)이 종종 있습니다.

객체 지향 디자인 을 사용하여 문제를 해결하는 방법을 알아 내려고 반성을 시도하십시오. 리플렉션을 진정으로 사용해야하는 경우 성능이 애플리케이션에 미치는 영향을 고려하여 적절하게 디자인하십시오.

0

리플렉션은 클래스 유형 정보를 구문 분석하여 작동합니다. 그것의 계산적으로 비싸기 때문에 드물게 사용하십시오.