【问题标题】:Confused about public, static and private methods/classes/variables in C#对 C# 中的公共、静态和私有方法/类/变量感到困惑
【发布时间】:2016-06-30 17:00:49
【问题描述】:

我是 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)

【问题讨论】:

  • 你的问题有点笼统。一般来说,static vs non-static 真的可以独立于每个开发者,没有基本规则。通常,当创建一个类的实例以使用该方法没有意义时,人们倾向于使用static 方法。这通常用于许多“实用程序”类中。有些人通常根本不喜欢使用static,因为它的可测试性较差。

标签: c# oop static private public


【解决方案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() - 使用类名的非静态方法。

【讨论】:

    【解决方案2】:

    作为一般经验法则:

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

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

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

    如果你遵循封装的原则,那么遵循的规则是一直使用private,如果需要,只使用internal。并且仅在必要时使用public

    【讨论】:

      【解决方案3】:

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

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

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

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

      我想到了一些静态的用途:

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

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

      【讨论】:

      • 如果一个函数不需要访问任何实例变量,那么它可以被公开以获得轻微的性能提升我认为你的意思是“可以制作static” .此外,我不会将初学者程序员与术语“性能增益”混淆,这实际上是一种通常可以忽略的微优化。您不希望人们到处传播静态方法。
      • 嗯,好吧,我想我理解其中的区别,但一般来说,我应该什么时候使用呢?为什么很多人根本不喜欢使用静态?
      • 是的,谢谢您的回答!我将阅读一些其他程序,并阅读更多对象和类以更好地理解。
      猜你喜欢
      • 2018-03-30
      • 1970-01-01
      • 2011-05-23
      • 2011-12-06
      • 2017-07-13
      • 2015-04-17
      • 2012-05-14
      • 2021-04-19
      • 2017-06-30
      相关资源
      最近更新 更多