我何时应该使用公共/私有/静态方法?

23

我是C#的新手。此前,我习惯将所有全局变量设置为public static。所有方法都是public static,这样我就可以从其他类中访问它们。

我在SO上读到,拥有尽可能少的public static方法会更好。因此,我通过将所有代码放入一个类(表单类)来重写应用程序。现在所有方法都是private的,没有static方法了。

我的问题:应该怎么做?在我看来,把所有东西都放在表单类里很愚蠢。

什么时候应该使用public、private和static private/public?

我认为public方法容易被反编译,但我对此表示怀疑。我的public方法也一样可以被反编译。私有方法中有哪些内容是“私有”的呢?

编辑:我不是在问如何防止我的程序被反编译,我在问是否应该使用static、private和public。还有:把所有代码都放在表单类中是否有问题,这样我就不必使用public方法了?


你的问题似乎是一个重复的问题:https://dev59.com/eHVD5IYBdhLWcg3wE3Ro - Adam Robinson
7个回答

16
除非有证据表明相反,否则一切都应该是私有的。 公共和私有之间的区别在于什么应该保持兼容性,什么不能保持兼容性,什么应该对世界感兴趣,什么不应该是它的事情。
当你声明某些内容为公共时,类(以及随之而来的对象)正在发出强烈的信号:这是我的可见接口,有许多其他接口像这样,但这是我的。公共接口是一个合同协议,你的类向世界其他地方(无论是什么意思)导出其可以执行的操作。
如果你修改了公共接口,你就冒着破坏世界其他地方假定的这个类合同的风险。另一方面,私有东西是类内部的。它支持类必须使用的功能,在携带对象状态的同时进行操作(如果它是方法),或者保持其内部状态(如果它是变量)。你可以自由地修改类的私有部分,而不会打破接口契约,这意味着你可以自由地重构(例如为了提高效率而改变内部数据表示方式)。私有部分不属于接口。
Protected 是涉及重新实现的开放性。尽可能避免深度嵌套的继承。你会冒着让重新实现类搞砸基类的风险。
从技术上讲,一个类应该声明一个接口(公共)和一个实现(私有)。接口根本不应该有代码,只需委托给私有“实现”逻辑。这就是为什么在Java和C#中有接口语句,它正式化了C++中的纯抽象类概念。
静态是在你的类逻辑领域中居住的东西,但不依赖于类本身的状态。它应该在设计模式指导下谨慎使用(例如单例、工厂方法)。

10

private关键字用于控制只有类内部的成员才能访问,在C#中,成员默认设置为私有(private),除非另有规定。

使用private的示例:

class Account
{

  private int pin = 1090;
  public int Pin
  {
     get { return pin; }
  }
}

public则完全相反,对于公共成员没有任何限制,所以那些用户可以访问的东西应该是公共的。

static与上述两者没有关系,因为它不涉及方法许可,而是一个常量或类型声明。如果将static应用于类,则类中的每个成员都必须声明为静态。

使用static的例子:

  static int birth_year= 1985

C# 参考中的修饰符会提供更详细的 C# 修饰符说明以及它们应该如何使用的示例。


“在类的主体内”...你是不是指那里应该是“在类主体内”? - c-a
你关于 C# 中静态的说法是错误的。 - Spivonious

5
已经在上面回答过了,但我认为可以简化一下...所以,如果其他类将使用此方法,请将方法公开;否则,请标记为私有。例如,您有类A和类B。假设类A有3个方法(x,y,z)。方法x、y将由类B使用,因此将它们都标记为公共方法,但是方法z只会被类A内的方法x使用,因此将其标记为私有方法,因为没有必要将该方法暴露给外部世界。该方法内的逻辑仅供内部使用。
静态不同,这种修饰意味着您不能创建标记为静态的对象的实例。该对象是静态的(不能被更改或修改)。

4

请参阅访问修饰符(C#编程指南)。但是,如果您能找到一本好的C#和OOP / OOD书籍,那将更好:这些是计算机科学的基础知识。

简而言之:访问修饰符促进封装,这基本上意味着每个类都应该将其私有成员保留给自己。


0
Java提供了许多访问修饰符,用于设置类、变量、方法和构造函数的访问级别。这四个访问级别分别是:

包内可见,默认情况下不需要任何修饰符。

仅对类可见(private)。

对外界可见(public)。

对包及其所有子类可见(protected)。

以下是一个示例:

public class Bicycle {

private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;

public Bicycle(int startCadence, int startSpeed, int startGear){
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;

   id = ++numberOfBicycles;
}

// new method to return the ID instance variable
public int getID() {
    return id;
}
    ...

}


0
除了上述内容外,还要考虑工作场景。你不是独自工作的。你的同行可能会从你的类中调用方法,而你实际上不想暴露这些方法,或者认为它们在未来需要进行重大更改。这可能是你想要私有化的情况。

0
这似乎比上面链接的问题更基础。要在面向对象(OO)语言中获得良好的发展,你需要找出如何将最终目标分解为一系列相互配合(甚至包含和扩展)的对象,以实现一系列目标。这种抽象具有许多好处,在你开始正确实施OO设计后会变得明显。如上所述,如果你还没有接触过解释“面向对象编程”基础知识的部分,你应该阅读一本新的C#书籍。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接