2009-12-16 3 views
0

클래스 프로그램의 field-str 및 main 함수의 변수 num에 액세스 할 수 있습니까? 필드 그냥 필요타이머 액세스 클래스 필드

class Program 
{ 
    string str = "This is a string"; 
    static void Main(string[] args) 
    { 
     int num = 100; 
     Debug.WriteLine(Thread.CurrentThread.ManagedThreadId); 
     var timer = new System.Timers.Timer(10000); 
     timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
     timer.Start(); 
     for (int i = 0; i < 20; i++) 
     { 
      Debug.WriteLine(Thread.CurrentThread.ManagedThreadId + " " + "current I is " + i.ToString()); 
      Thread.Sleep(1000); 
     } 
     Console.ReadLine(); 
    } 

    static void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Debug.WriteLine(str); 
     Debug.WriteLine(num); 
     Debug.WriteLine(Thread.CurrentThread.ManagedThreadId + " current is timer"); 
     //throw new NotImplementedException(); 
    } 
} 

최고 감사합니다,

답변

1

static를 만들 수 있습니다.

static string str = "This is a string"; 

당신이 lambda expression를 사용할 필요가 num에 액세스하려면.

timer.Elapsed += new ElapsedEventHandler((s, e) => 
{ 
    Debug.WriteLine(str); 
    Debug.WriteLine(num); 
    Debug.WriteLine(Thread.CurrentThread.ManagedThreadId + " current is timer"); 

}); 

anonymous method을 사용할 수도 있습니다.

timer.Elapsed += new ElapsedEventHandler(delegate(object sender, ElapsedEventArgs e) 
{ 
    Debug.WriteLine(str); 
    Debug.WriteLine(num); 
    Debug.WriteLine(Thread.CurrentThread.ManagedThreadId + " current is timer"); 

}); 

하나 이상의 옵션이 있습니다. System.Threading.Timer 클래스를 사용하면 상태 객체를 전달할 수 있습니다.

var timer = new System.Threading.Timer((state) => 
{ 
    Debug.WriteLine(str); 
    Debug.WriteLine(state); 
    Debug.WriteLine(Thread.CurrentThread.ManagedThreadId + " current is timer"); 
}, num, 10000, 10000); 
+0

익명의 방법으로 생각하지 않았습니다. – GrayWizardx

+0

관심이 있으시면 종결에 관해 읽어보십시오. http://en.wikipedia.org/wiki/Closure_%28computer_science%29 – ChaosPandion

0

str은 클래스 수준이므로 구현 된 그대로 정적으로 변경하면 직접 액세스 할 수 있어야합니다. Num은 내부적으로 main에 있으므로 참조를 전달하지 않으면 액세스 할 수 없습니다. 외부로 main으로 이동하거나 ElapsedEventArgs에서 지원되는 것이 참조를 전달하여이를 검색 할 수 있습니다.

+0

그냥 체크하고 ElapsedEventArgs에 상태를 유지할 객체가없는 것 같습니다. 전역 참조 (클래스 수준에 num 이동) 또는 델리게이트 등을 사용하여 도달 할 수있는 참조 포인터를 제공해야합니다. – GrayWizardx