2014-06-22 171 views
1

爲什麼運行此C#代碼在Main中顯示F1();錯誤?Main方法中的調用函數

namespace Project1 
{ 
    public partial class Program1 
    {  
     private void F1() 
     { 
      Console.WriteLine("F2"); 
     } 

     private void F2() 
     { 
      Console.WriteLine("F1"); 
     } 

     static void Main(string[] args) 
     { 
      F1(); 
     } 
    } 
} 

這是一個控制檯應用程序。如果我定義了類Program1的對象,它將起作用。 但是,當我在Windows窗體應用程序上嘗試此操作時,我可以將F1();置於button_click事件中,並且它在沒有定義對象Class Form1的情況下運行時沒有錯誤?

+2

您忘記將您的方法F1()&F2()標記爲靜態!讓它看起來像:private static void F1()... –

+1

我注意到你反轉了正在寫出的字符串 - 你的F1函數寫出「F2」。 – mdebeus

回答

3

您尚未將方法定義爲static。因此,您需要先創建一個類的實例,然後使用該實例調用它們。

如果你想直接調用這些方法,你可以使它們成爲static。在這種情況下,由於您似乎只是顯示靜態文本,因此可以這麼做。但是,通常情況下,方法實際上需要根據實例進行操作,因此必須這樣調用。你可能想看看this question,它討論了什麼時候制定方法static是合理的。

2

下面是兩個備選方案:

namespace Project1 
{ 
public partial class Program1 
{  
    private void F1() 
    { 
     Console.WriteLine("F1"); 
    } 

    private void F2() 
    { 
     Console.WriteLine("F2"); 
    } 

    static void Main(string[] args) 
    { 
     var program1 = new Program1(); 
     program1.F1(); 
    } 
} 
} 

或者......

namespace Project1 
{ 
public partial class Program1 
{  
    static private void F1() 
    { 
     Console.WriteLine("F1"); 
    } 

    static private void F2() 
    { 
     Console.WriteLine("F2"); 
    } 

    static void Main(string[] args) 
    { 
     F1(); 
    } 
} 
} 

BTW,我改變了你的WriteLine文字來反映被調用的函數。

+0

感謝您的回答,但爲什麼這些方法沒有靜態工作時,我把它們放在一個「窗體應用程序」?我可以在按鈕點擊事件中調用它們,而不會將它們聲明爲靜態? – NESHOM

+0

Program1是一個部分類 - 這意味着還有一些其他文件包含另一組函數,它們是該Program1類的一部分。如果按鈕單擊的事件函數是Program1類的一部分(可能在另一個文件中),並且它不是靜態的,則它可以調用該類中的非靜態函數。 – mdebeus

+0

我不是在談論上面的代碼。我正在談論何時使用窗體上的按鈕創建新的Windows窗體應用程序。如果我從接近button_clicked事件的上述代碼中複製粘貼「Function F1」,我可以在按鈕點擊事件中調用F1()。所以問題是,爲什麼它在那裏工作,而不是在控制檯應用程序? – NESHOM