2011-08-09 30 views
11

Tôi có bộ hẹn giờ và tôi muốn đặt lại các cuộc gọi hẹn giờ thành các chức năng riêng biệt, tuy nhiên, tôi gặp phải lỗi này.Cần có một tham chiếu đối tượng để truy cập thành viên không tĩnh

Một tham chiếu đối tượng được yêu cầu để truy cập vào lĩnh vực phi tĩnh, phương pháp, hoặc tài sản '' ...

Nếu Tôi cam đoan những callbacks như các sự kiện đại biểu và biến thành viên như tĩnh, nó hoạt động khỏe. Tôi có nên để nó theo cách đó không?

class MainClass 
{ 
    private Timer _timer = null; 
    private TimeSpan _millisecs; 

    public static void Main (string[] args) 
    { 
     Application.Init(); 
     MainWindow win = new MainWindow(); 

     Label lbl = new Label(); 
     lbl.Text = "00:00"; 

     Table tbl = new Table(2, 2, true); 
     tbl.Name = "tbl"; 

     Button btn = new Button("Start"); 
     tbl.Attach(lbl, 0, 2, 0, 1); 
     tbl.Attach(btn, 0, 1, 1, 2); 
     Button btn_stop = new Button("Stop"); 
     tbl.Attach(btn_stop, 1, 2, 1, 2); 

     btn.Clicked += StartClick; 
     btn_stop.Clicked += StopClick; 

     win.Add(tbl); 
     win.ShowAll(); 

     Application.Run(); 
    } 

    private void StartClick(object obj, EventArgs args) 
    { 
     if (_timer == null) { 
      _timer = new Timer(); 
      _timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { 
       _millisecs = _millisecs.Add(new TimeSpan(0, 0, 0, 0, 50)); 
       lbl.Text = new DateTime(_millisecs.Ticks).ToString("ss:ff"); 
      }; 
      _timer.Interval = 50; 
      _timer.Enabled = true;     
     } 

     _timer.Start();    
    } 

    private void StopClick(object obj, EventArgs args) 
    { 
     _timer.Stop();   
    } 

} 
+0

tại sao không sử dụng Application.Run (new MainWindow()); sau đó đăng ký các sự kiện bên trong lớp học? – aspark

Trả lời

22

Tùy thuộc vào những gì bạn đang cố gắng làm. Bạn có thể hoặc làm cho mọi việc tĩnh, hoặc bạn có thể tạo một thể hiện:

MainClass instance = new MainClass(); 
btn.Clicked += instance.StartClick; 
btn_stop.Clicked += instance.StopClick; 

Tôi giả định này không phải là thực ứng dụng của bạn, vì vậy thật khó để nói những gì bạn nên làm trong mã thực sự của bạn . Cá nhân tôi muốn nghiêng về phía tạo một thể hiện - biến tĩnh đại diện cho trạng thái toàn cầu là thường là một ý tưởng tồi (về mặt khả năng kiểm thử, v.v.). Chúng tôi không thể biết liệu điều đó có ảnh hưởng đến hoàn cảnh của bạn hay không.

Điều quan trọng là bạn hiểu được lý do tại sao bạn nhận được thông báo lỗi và lý do thay đổi ở trên sửa lỗi đó. Khi bạn hiểu điều đó, bạn sẽ ở trong tình huống tốt hơn để đưa ra quyết định tốt nhất.

+0

Vâng, giờ đã rõ. Và tôi có lẽ nên đặt lớp hẹn giờ của tôi trong một tệp riêng biệt. Cảm ơn! –

+0

Odd rằng điều này làm việc trong trường hợp của tôi, nhưng về cơ bản chỉ là những gì tôi cần. Cảm ơn ~ – James

1

Đó là vì bạn đang truy cập các phương pháp không tĩnh từ tĩnh trong trường hợp này.

Hoặc tạo ra đối tượng của lớp và hơn gọi phương thức

ObjectOfClass obj = new ObjectOfClass(); 
obj.MethodName(); 

như vậy trong trường hợp của bạn

MainClass obj = new MainClass(); 
btn.Clicked += obj.StartClick; 
btn_stop.Clicked += obj.StopClick; 

Hoặc tạo ra các phương pháp gọi là tĩnh (mà bạn đã cố gắng như bạn nói).

Các vấn đề liên quan