2012-06-14 4 views
2

전역 변수가있는 Windows Forms 응용 프로그램 - testPath이라는 문자열이 있습니다.C# - 이벤트 처리기에서 전역 변수에 액세스 할 수 없습니다.

이 문자열은 경로를 저장하는 데 사용됩니다. 기본값은 C:\temp\입니다. 사용자가 버튼을 클릭하면이 디렉토리가 만들어집니다 (아직없는 경우).

사용자가 경로 값을 변경하려는 경우를 대비하여 텍스트 상자 컨트롤도 있습니다.

단추의 이벤트 처리기에서 testPath에 액세스하려고 시도하고 null 참조가 나타납니다.

어디서나 testPath의 값을 변경하지 않습니다. 텍스트 상자 컨트롤과주고받을 때를 제외하고는 어디에도 없습니다.

내가 뭘 잘못하고 있니? 전역 변수는 1 초 안에 내부 변수에 어떤 영향을 주며 그 후에 바로 null 참조를 가리 킵니까?

public string testPath = @"C:\temp\"; 

public MainForm() 
{ 
    //Windows Designer call 
    InitializeComponent(); 

    //Show the testPath in the textBox (using Invokes) 
    this.textBox1.Invoke(new MethodInvoker(delegate { this.textBox1.Text = testPath; })); 

    //here, testPath contains 'C:\temp\' 
} 

//Button "Click" handler 
private void Button1Click(object sender, EventArgs e) 
{ 
    //here, testPath contains a null reference! 

    //If the user changed testPath in the textBox, we need to save it again 
    this.textBox1.Invoke(new MethodInvoker(delegate { testPath = this.textBox1.Text; })); 

    //Create the path 
    if(!Directory.Exists(testPath)) //If it does not exist already 
    { 
     Directory.CreateDirectory(testPath); 
    } 

    //...Do something else 

} 
+3

C#에는 전역 변수가 없습니다. 멤버 변수일까요? – GregC

+0

이 코드가 모두 하나의 파일에 있고 같은 네임 스페이스 안에 있다고 가정합니다. 이 경우 파일에 testPath가 null로 설정되는 코드가 있어야합니다. .. –

+0

전체 수업을 보여줄 수 있습니까? 너무 길면 여기에서 언급되지 않은 멤버는 생략하면서 "완전한"클래스일까요? –

답변

0

내가 대신 버튼을 클릭 이벤트의 범위를 벗어난 경로를 선언, 당신이 방법 안에 선언 제안했다 :

여기에 전체 코드입니다. 그래서 같이

:

private void Button1Click(object sender, EventArgs e) 
{ 
    string testPath = @"C:\temp\"; 

    //Create the path if it does not exist  
    if(!Directory.Exists(testPath))  
      Directory.CreateDirectory(testPath);  
} 
+4

메서드 내에서 "public"을 사용할 수 없습니다. –

+0

죄송합니다, 당신은 바로 Uwe입니다! – Brian

+1

이것은 좋은 생각이지만, 이벤트 처리기 외부의 다른 방법으로 testPath에 액세스 할 수있게하고 싶습니다 ... – user1183352

3

내가 같은 읽기 전용 필드 testPath을 표시 시도하고 컴파일러 오류를 따를 것입니다.

const와 readonly의 차이점은 여기 a tutorial입니다.

EDIT로드 이벤트에 대한 사용자 지정 처리기를 구현하여 거기에서 상태를 검사 할 수 있습니다. 또한 폼로드 이벤트를 처리 할 때와 사용자 입력을 처리 할 때 F10을 사용하여 단계별로 객체를 생성 할 수 있습니다. 함수를 입력 할 때 모든 변수는 여는 중괄호에 초기화되지 않은 것으로 표시됩니다. 적어도 한 번 훑어보고 기능을 살펴보아야합니다. 핀을 사용하여 텍스트 편집기에서 변수를 주시하십시오.

+0

http://stackoverflow.com/questions/55984/what-is-the-difference-between- const-and-readonly – GregC

+0

testPath의 값을 변경하고 싶다고 생각하면, 상수 또는 읽기 전용으로 설정하지 않는 것이 좋습니다. 아이디어를 제공해 주셔서 감사합니다. – user1183352

+0

그는 영원한 방법으로 읽기 전용으로 만드는 것을 의미하지는 않았지만, null로 설정되는 곳을보기위한 디버깅 도구 인 것처럼 –

8

나는이 일정을 제안 :이 값을 설정하려는 시도가 컴파일러 오류로 플래그가되게합니다

const string testPath = @"C:\temp\"; 

. 값을 사용하면 변경하지 않고도 작동합니다.

당신이 변화 값을 원하기 때문에

, 나는 속성으로이 재 작업 추천 : 의견에 대 한 응답에서


편집

private string _testPath = @"C:\temp\"; 
private string testPath 
{ 
    get { return _testPath; } 
    set 
    { 
     _testPath = value; 
    } 
} 

는 그런 다음에 브레이크 포인트를 설정할 수 있습니다 줄을 _testPath = value;, 디버거에서 정확히 null로 설정하는 참조하십시오. 이 문제가 해결되면 표준 .NET 명명 규칙과 일치하도록 명명을 수정하는 것이 좋습니다.

+0

나는 아직도 그가 일하지 않는 이유를 알고 싶습니다. 나는 버튼으로 폼을 만들고 변수와 버튼 클릭 코드를 복사했고 내 작업은 잘되었다. – Yatrix

+2

@Yatrix 예 - 어딘가 다른 뭔가가 설정 중입니다. 'const'로함으로써 원래의 포스터는 컴파일러 오류가 될 수 있기 때문에 정확히 무엇이 null로 설정되는지를 알 수 있습니다. –

+0

내가 들었어. 영리한 생각. – Yatrix

1

: 왜이 공용 변수가 필요한지 잘 모르겠습니다. "C : \ temp \"와 같은 초기 값을 가진 컨트롤을 간단하게 초기화하려면 & 사용자가 원하는 경우 편집 할 수 있습니다. 이 경우 디자인보기에서 양식을 열고 텍스트 상자를 마우스 오른쪽 단추로 클릭 한 다음 속성으로 이동하십시오. 속성 창에서 Text 속성을 "C : \ temp \"로 변경하면 텍스트 상자가 "C : \ temp \"로 초기화됩니다. testPath 변수 양식이 초기화 된 후에 null로 수정지고 있지만 버튼을 클릭하기 전에 : 이벤트 핸들러에서 당신은 단순히 원본

private void button1_Click(object sender, EventArgs e) 
{ 
    if (!Directory.Exists(this.textBox1.Text.Trim())) 
     { 
      Directory.CreateDirectory(this.textBox1.Text.Trim()); 
     } 

} 

쓸 수 있습니다. 공개 변수이기 때문에 클래스 외부에서 수정 된 &에 액세스 할 수 있습니다. 이 문제를 재현하는

쉬운 방법 중 하나 - 프로그램 클래스에서> 주요 방법

[STAThread] 
static void Main() 
{ 
    Form1 obj = new Form1(); 
    obj.testPath = null; 
    Application.Run(obj); 
} 

제안 : 1. 만들기 testPath 상수 또는 읽기 전용이 수정되고 있는지 확인. 2. 공개 할 필요가없는 경우 액세스 지정자를 private로 변경하십시오.

+0

내 경로와는 별도로 testPath를 수정하는 것처럼 보입니다. 또한 testPath는 처음에는 비공개였습니다. 공개 가능성을 높이면 문제를 해결할 수 있기를 바 랐습니다. 그러나 다른 게시물에서 지적한 것처럼 testPath를 수정하여 상수 또는 읽기 전용 유형으로 설정하면 내 상황에 도움이되지 않습니다. 그래도 고마워 – user1183352

+0

업데이트를보고 내 응답을 업데이트했습니다 :) –

+0

디자이너 모드에서 Text 속성을 변경하려고했지만 동일한 문제가 발생합니다. TextBox의 "Text"속성이 표시되지 않거나 코드에 따라 null 참조로 설정됩니다. . – user1183352

관련 문제