对C#中的公共,静态和私有方法/类/变量感到困惑

时间:2016-03-15 10:07:41

标签: c# oop static private public

我是C#编程的初学者,来自Python背景。

我对关键字public和static感到困惑。有人可以为我澄清一下这个区别吗?

(顺便说一句,我已经知道私有变量/方法永远不能在函数外部访问,而Public可以访问)

这是我随机尝试理解静态和非静态方法之间区别的东西。

using System;

public class MainClass
{
    public static void Main ()
    {
        int[] anArray =  getAnArray();

        foreach (int x in anArray) 
        {
            Console.WriteLine (x);
        }

        MainClass m = new MainClass ();
        foreach (int x in anArray) 
        {
            m.Print(x);
        }
    }

    public static int[] getAnArray() 
    {
        int[] myArray = { 1, 2, 3, 4 };
        return myArray;
    }

    public void Print(int x) 
    {
        Console.WriteLine(x);
    }
}

据我所知,要使用非静态方法Print,我首先需要创建一个MainClass实例,然后通过执行m.Print()

来访问该方法

但是我不明白何时使用哪个。据我所知,如果Print是静态的,那将会容易得多,因为我不需要创建我自己的函数的新实例。

例如,这将更简单

private static void Print(int x)
{
    Console.WriteLine (x);
}

使用Print(x)调用Print函数,而不是先创建Main实例。

那么基本上何时使用什么?什么时候不仅使用静态或非静态方法而且使用变量甚至类? (例如,何时应该使用公共静态类MainClass)

3 个答案:

答案 0 :(得分:1)

使用中的公共/非静态和静态方法的小型自解释示例:

Car car1 = new Car();
car1.setBrand("Ford"); //public non-static method
Car car2 = new Car();
car2.setBrand("Opel"); //public non-static method

Car.CompareParameters(car1, car2); //static method

基本上,非静态方法和属性描述了这种类的对象。

您不能使用类名调用Car.setBrand() - 非静态方法。

答案 1 :(得分:1)

作为一般经验法则:

静态方法 static关键字使方法可以直接访问,而无需创建对象的实例。因此,它所具有的任何状态或副作用将是static,即"全球"。因此,只能使用static创建纯函数,即仅从输入中获取返回值的方法,既不从方法外部读取或写入状态。

使用static是简化代码和测试之间的权衡。您放入static方法的副作用越多,您的代码就越难以测试。

公开方法 标记为public的任何内容都可在整个应用程序中访问。标记某些内容internal会将其限制为该程序集(您可以查看术语"程序集"等同于解决方案中的项目")private将其限制为仅在课程/结构中评估。

如果您遵循封装原则,则遵循的规则始终使用private,如果需要,仅使用internal。如果你真的需要,只能使用public

答案 2 :(得分:-1)

static成员是类成员,并在该类的所有实例之间共享。

其他类可以使用

public个方法/属性。可以有一个public static成员,可供其他类使用。

您无法从静态成员访问非静态成员。

如果函数不需要访问任何实例变量,那么可以使static获得轻微的性能提升,但是有更多有用的方法可以使用静态成员。

一些用于静电的用途:

  • 单身人士(你创建一个受类内静态变量访问的受保护构造函数)
  • Console.WriteLine是静态的
  • 锁定/信号量(所有实例共享的类级别只有一个可用)

如果某个类的所有实例共享某些内容是有意义的,请将其设为静态