2014-09-18 1 views
0

저는 C#의 초보자이며 static void Main()에서 함수 즉 SetTimer()을 호출하려고합니다. 그러나 아래에 SetTimer(11, 48, 00);SetTimer(11, 35, 40);으로 오류가 있습니다. 사실, Main() 함수를 사용하면 양식에서 제대로 작동 할 수 있습니다."정적 메인"방법으로 다른 함수를 호출하는 방법은 무엇입니까?

  • 공공 무효
  • 정적 무효
  • 공공 정적 무효
  • 개인 정적 무효
  • 무효

: 나는 이러한 유형을 사용하는 방법과시기에 대한 혼란스러워 있어요
using Microsoft.Win32; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 
using System.Windows.Forms; 

namespace SetTimerAlert 
{ 
    public class Program 
    { 
     int count = 0; 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      //Application.EnableVisualStyles(); 
      //Application.SetCompatibleTextRenderingDefault(false); 
      //Application.Run(new Form1()); 

      RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

      //Application.Run(new Form1()); 
      if (rkApp.GetValue("SetTimerAlert") == null) 
      { 
       Application.Run(new Form1()); 
      } 
      else 
      { 
       SetTimer(11, 48, 00); 
       SetTimer(11, 35, 40); 
      } 
     } 

     public void SetTimer(int hh, int mm, int ss) 
     { 
      DateTime dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hh, mm, ss); 
      TimerCallback callback = new TimerCallback(ProcessTimerEvent); 

      if (DateTime.Now < dt) 
      { 
       var timer = new System.Threading.Timer(callback, null, 
        //other occurrences every 24 hours 
           dt - DateTime.Now, TimeSpan.FromHours(24)); 
      } 
     } 

     public void ProcessTimerEvent(object obj) 
     { 
      if (count == 0) 
      { 
       //rkApp.SetValue("SetTimerAlert", Application.ExecutablePath.ToString()); 
       MessageBox.Show("Please run programs."); 
       count++; 
      } 
      else 
      { 
       MessageBox.Show("Hey! I did not see the program runs. Your computer will be shut down for 15 seconds."); 
      } 
     } 
    } 
} 
+0

개체를 인스턴스화합니다. 인스턴스 메소드를 호출하십시오. – user2864740

답변

2

클래스의 정적 멤버 (예 : 속성, 메서드 등) 만 사용하거나 클래스의 멤버를 사용하지 않는 경우 메서드를 정적으로 설정하십시오.
그렇지 않으면 정적이 아니어야합니다.
private은 클래스 외부에서 액세스 할 수 없음을 의미하므로 클래스 외부에서 사용하지 않으려는 경우 - 비공개로 설정하십시오.
void은 아무 것도 반환하지 않음을 의미합니다.
따라서 이 아니기 때문에 SetTimer이 반환되지 않으므로 클래스 멤버를 사용하지 않으므로 static이 될 수 있으며 클래스 외부에서 사용하지 않으려는 경우 그것을 만들 수 있습니다 private.
은 그래서 메소드 서명은 다음과 같아야합니다

public static void SetTimer(int hh, int mm, int ss) 

다시 말하지만, 그것은 그것이 있어야하는 경우, 클래스 외부에서 호출 아니에요 않는 :

private static void setTimer(int hh, int mm, int ss) 

참고 : 지시 명명 규칙이 개인 방법 ' 이름은 대문자로 시작하지 않습니다.

SetTimercountProcessTimerEvent을 모두 사용하기 때문에 둘 다 static으로 설정해야합니다.

+0

이러한 유형에 대해 정의 해 주셔서 감사합니다. 이 경우 어떻게'SetTimer (11, 48, 00);에서'public void SetTimer (int hh, int mm, int ss) {...}'를 호출 할 수 있습니까? –

+0

수정 됨. 호출을 변경하지 않고 메소드 서명을 변경하십시오. –

+0

'public'을'static'으로 변경 한 후'int count = 0','count == 0' 및'count ++'오류가 있습니다. 그것은'정적이지 않은 필드, 메소드, 또는 프로퍼티 'SetTimerAlert.Program을 위해 객체 참조가 필요하다는 에러를 보여줍니다.count'' –

0

모두 Timer와 SetTimer 메서드는 정적 메서드 "Main"에 의해 호출되는 경우 정적이어야합니다. 정적 메서드는 클래스의 인스턴스 메서드를 호출 할 수 없지만 인스턴스는 정적 메서드를 호출 할 수 있습니다.

+0

잘못되었습니다. "정적 메서드는 인스턴스 메서드를 호출 할 때 암시 적으로 사용할 this 인스턴스가 없으며" –

+0

True "인스턴스를 제공 할 때만 사용할 수 있습니다. 그러나 내가 잘못 말한 것은 무엇입니까? 당신은 단지 설명에 덧붙였다. – ForeverZer0

+0

같은 클래스의 정적 메서드에서는 인스턴스 메서드를 호출 할 수 없다고 했잖아요. 인스턴스가 제공되면 호출 할 수 있습니다. 예를 들어 연산자 오버로드는 정적 메서드이지만 피연산자의 인스턴스 메서드, 속성 및 필드에 액세스합니다. –

관련 문제