2017-01-20 6 views
0

저는 C#을 처음 접했고 런타임시 로컬로 선언 된 필드 값을 가져올 수 있는지 알고 싶습니다. 예를 들어, 아래 예제의 ClassToTest는 변경할 수 없습니다.런타임에 로컬 필드 값 가져 오기

예 :

public class ClassToTest { 
    public void func() { 
    int number = 25; 
    } 
} 

Public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    instance.func(); 
    // Can field "number" value be extracted here? 
    } 
} 

내가 반사 및 기타 조립 관련 물건을하지만 여전히 행운을 찾고있다. 어떤 제안이라도 대단히 감사하겠습니다.

+1

아니요, 불가능하며 그렇게 할 이유가 없습니다. 'number'는 메소드가 아닌 클래스에 적용됩니다. 또한 컴파일 할 수있는 게시 코드로 시작해야합니다. 당신이 그것을 실행할 수 있는지 직접 테스트하십시오.값을 원하면 메서드에서 반환하거나 클래스/인스턴스 범위 속성을 만들고 값을 설정합니다. – Igor

+0

나는 예제를 얻을 수있는 가장 간단한 것으로 축소했다. 원래 내가 작업하고있는 프로그램은 이것보다 훨씬 크고 복잡합니다. 또한 ClassToTest를 리팩터링 할 수 없습니다. –

+0

아주 간단합니다. 이 메소드는 값을 설정하지만 범위를 벗어나면 (즉, 메소드가 실행을 마친 즉시) 변수와 그 값이 스택에서 팝핑됩니다. 그 가치를 얻을 수있는 방법은 없습니다. 또한 가치를 얻으 려하지 마라. 그것은 단지 ** 매우 나쁜 프로그래밍 습관이다. 당신은 캡슐화를 깨뜨릴 것입니다. 그 값에 관심이 있다면, 그것을 알고있는 인스턴스에서 그것을 설정하는 방법을 찾거나 그것을 반환하거나 그것을 다시 계산하는 새로운 메쏘드를 작성하십시오. – Igor

답변

0

이것은 기능이 작동하는 방식이 아닙니다. 다음 경우 INT 번호 = instance.func() 값을 리턴

public class ClassToTest { 
    public int func() { 
    return 25; 
    } 
} 

Public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    int number = instance.func(); 
    } 
} 

함수 (즉 25 반환) 복귀 형 (즉 INT), 및 창을 가져야한다; 실행되면, FUNC() 메소드는 25을 반환하고 수

+0

죄송합니다. 나는 그것을 편집했다. 감사합니다 @ 벤 –

0

번호

당신이 함수 내부에있는 동안 지역 변수는 존재

을 int로 보관됩니다. 일단 함수를 종료하면 지방 변수가 끈적 거리는 연기로 사라집니다.

당신은 속성에 액세스하는 반사를 사용할 수 있습니다 (공공 및 민간 모두.)

건배,

아담.

+0

별도의 스레드에서 메서드를 실행하고 함수가 아직 종료되지 않은 상태에서 thread.sleep()을 수행하면 어떨까요? 그렇다면 반성을 할 수 있을까요? @Adam –

+0

안녕하세요 안젤로, 나는 지금이 다른 게시물로 덮여 있다고 생각합니다. 하지만 나는 페니가 아직 당신을 위해 떨어 졌다고 생각합니다. 그것은 끔찍하게 혼란스럽게 보일지 모르지만 그걸 고수하십시오 - 그것은 모두 의미가있을 것입니다, 나는 약속합니다! :-) –

-1

Body에서 선언 된 내용이 외부 범위에서 액세스 할 수 없기 때문에 가능하지 않습니다. 변수가 func() 메소드 내에서만 사용 가능하다는 것을 의미합니다. 당신이 할 수있는 것은 당신이 필요로하는 가치를 되 돌리거나 재산을 선언하는 것입니다. 문제는이 같은 일을 할 수있는 속성

public int Func() 
{ 
    return 25; 
} 

public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    int number = instance.func(); 
    //number will be 25 
    } 
} 

:

public class ClassToTest { 

    public int Number{get{return 25;};private set;} 
} 

Public class MyProgram { 
    public static void Main() { 
    ClassToTest instance = new ClassToTest(); 
    int number = instance.Number; 
    } 
} 

메서드 또는 속성을 사용하여 당신의 결정이다. 하지만 다음과 같이 생각할 수 있습니다.

"내 개체는 무엇으로 구성되어 있습니까?"및 "내 개체가 할 수있는 것".

예를 들어 자동차에는 바퀴가 있습니다. 그래서 재산으로 휠을 대표하십시오. 그러나 자동차는 움직일 수 있으므로 방법으로 운동을 구현하십시오.

0

다른 방법이나 심지어 다른 스위치 케이스 일 수도 있습니다. 현재 범위를 벗어나는 변수에 액세스 할 수 없습니다. 나는 또한 개인 세터하는 것이 가능하게와 조합 재산에 대한 공공 게터를 사용

public class ClassToTest { 
    public int Number { get; private set; } 
    public void func() { 
     this.Number = 25; 
    } 
} 

Public class MyProgram { 
    public static void Main() { 
     ClassToTest instance = new ClassToTest(); 
     instance.func(); 
     var i = instance.Number; 
    } 
} 

: 그러나 이유는이 작업을 수행하지 않으려면 놈의 대신 당신의 방법 내에서 속성을 설정하여 동일한 작업을 수행 할 수 있습니다 Number - 값을 에서 안으로 변경하고 외부에서는 변경하지 마십시오.

다른 사람들이 지적한 또 다른 방법은 func의 값을 반환하는 것입니다.

+0

'public int Numer {get; 개인 집합; }'이름에 약간의 실수가 있습니다. – nbadaud

+0

@nbadaud 고마워요. – HimBromBeere

+0

위의 주석에서 말했듯이 : "예제를 얻을 수있는 가장 간단한 것으로 축소했습니다. 원래 작업하고있는 프로그램은 이보다 훨씬 크고 복잡합니다. 또한 클래스 토 테스트를 리펙토링 할 수 없습니다. ". –