C# 在Main方法中调用函数

C# 在Main方法中调用函数,c#,function,call,C#,Function,Call,为什么运行此C#代码会在F1()上显示错误在主目录中 namespace Project1 { public partial class Program1 { private void F1() { Console.WriteLine("F2"); } private void F2() { Console.WriteLine("F1")

为什么运行此C#代码会在
F1()上显示错误在主目录中

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()
按钮中单击
事件,它运行时没有错误,没有定义
类Form1的对象

您没有将方法定义为
静态
。因此,您需要首先创建类的实例,然后使用该实例调用它们


如果您想直接调用这些方法,可以将它们设置为
static
。在这种情况下,因为您似乎只是显示静态文本,所以这样做很好。然而,通常情况下,方法实际上需要作用于实例,因此必须这样调用。您可能想看看,其中讨论了使方法
静态

有意义的时候您还没有将方法定义为
静态
。因此,您需要首先创建类的实例,然后使用该实例调用它们


如果您想直接调用这些方法,可以将它们设置为
static
。在这种情况下,因为您似乎只是显示静态文本,所以这样做很好。然而,通常情况下,方法实际上需要作用于实例,因此必须这样调用。您可能想看看,其中讨论了使您的方法成为静态方法的意义,下面是两个备选方案:

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();
    }
}
}
或者


顺便说一句,我更改了您的WriteLine文本以反映正在调用的函数。

以下是两个备选方案:

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();
    }
}
}
或者


顺便说一句,我更改了WriteLine文本以反映所调用的函数。

您忘记将方法F1()&F2()标记为静态!让它读起来像:private static void F1()…我注意到您颠倒了要写出的字符串-您的F1函数写出了“F2”。您忘了将方法F1()&F2()标记为static!让它读起来像:private static void F1()…我注意到您颠倒了要写出的字符串-您的F1函数写出了“F2”。谢谢您的回答,但是当我将这些没有静态的方法放在“windows窗体应用程序”中时,为什么这些方法可以工作?例如,我可以在button clicked事件中调用它们,而不将它们声明为静态?Program1是一个分部类-这意味着还有一些其他文件包含另一组函数,这些函数是这个Program1类的一部分。如果button clicked事件函数是Program1类的一部分(可能在另一个文件中),并且它不是静态的,那么它可以调用类中的非静态函数。我指的是在窗体上创建一个带有按钮的新Windows窗体应用程序。如果我将上述代码中的粘贴“Function F1”复制到button_clicked事件附近,我可以在button clicked事件中调用F1()。所以问题是为什么它在那里工作而在控制台应用程序中不工作?区别在于您的按钮单击事件不是静态的,而控制台应用程序中的主要功能是静态的。如果没有拥有非静态函数的类的实例,则无法在静态函数中调用非静态函数。请查看此MSDN页面上的静态vs实例成员:感谢您的回答,但是,当我将这些没有静态的方法放入“windows窗体应用程序”中时,为什么这些方法可以工作?例如,我可以在button clicked事件中调用它们,而不将它们声明为静态?Program1是一个分部类-这意味着还有一些其他文件包含另一组函数,这些函数是这个Program1类的一部分。如果button clicked事件函数是Program1类的一部分(可能在另一个文件中),并且它不是静态的,那么它可以调用类中的非静态函数。我指的是在窗体上创建一个带有按钮的新Windows窗体应用程序。如果我将上述代码中的粘贴“Function F1”复制到button_clicked事件附近,我可以在button clicked事件中调用F1()。所以问题是为什么它在那里工作而在控制台应用程序中不工作?区别在于您的按钮单击事件不是静态的,而控制台应用程序中的主要功能是静态的。如果没有拥有非静态函数的类的实例,则无法在静态函数中调用非静态函数。请查看此MSDN页面,了解静态vs实例成员: