繁体   English   中英

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

[英]Confused about public, static and private methods/classes/variables in C#

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

我对关键字public和static感到困惑。 有人可以帮我澄清一下吗?

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

我只是随机尝试了解静态和非静态方法之间的区别。

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)

使用的公共/非静态和静态方法的小型自说明示例:

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() -非静态方法。

作为一般经验法则:

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

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

公共方法在整个应用程序中都可以访问所有标记为public内容。 internal标记某些内容将其限制为仅该程序集(您可以将术语“程序集”视为与您的解决方案中的项目等效),而将其private则将其限制为只能在类/结构中评估。

如果遵循封装原则,那么遵循的规则将始终使用private ,如果需要则仅使用internal 并且仅在确实需要时才使用public

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

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

您不能从静态成员访问非静态成员。

如果某个函数不需要访问任何实例变量,则可以将其设置为static以稍微提高性能,但是还有更多使用静态成员的有用方法。

我头顶上有一些用于静电的用途:

  • 单例(您创建一个受保护的构造函数,该构造函数可通过类内的静态变量访问)
  • Console.WriteLine是静态的
  • 锁/信号灯(所有实例共享的类级别只有一个)

如果有意义的事情可供类的所有实例共享,请使其静态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM