通过方法设置变量和设置实际变量的区别



我没有编程经验,但我想知道通过方法设置变量有什么区别。

前任:

void setShowFPS(boolean b){
    this.showFps = b;
}

与仅调用变量

showFps = false;

通常,最好将类变量设置为私有,这意味着除非通过变量所属类的方法和构造函数设置它们。 使用方法设置变量(这些方法称为 setters)的优点是可以在方法中提供验证逻辑。

例如,如果您的类中有一个变量应该表示一天中的小时,则您只希望它保持值 0 到 23。 每当方法的用户尝试将变量设置为此范围之外的任何值时,资源库都可以引发异常。

通常,最好不要将变量暴露给类外的用户。方法为您提供了更多的控制 - 例如,如果您想在布尔变量设置为 true 时触发事件,您可以在方法中执行此操作,但在设置变量时无法执行此操作:

void setShowFPS(boolean b) {
    this.showFps = b;
    // Trigger the event
    if (b) {
        OnFpsSet();
    }
}

此外,C# 还提供了属性,这些属性为您提供了与方法一样多的控制和封装,它们在外部看起来像变量。使用属性而不是单参数 setter 方法更习惯

bool _ showFps;
bool showFps {
    get {
       return _showFps;
    }
    set {
       _showFps = value;
    }
}
void setShowFPS(boolean b){ this.showFps = b; }

这是一个相对简单的过程。例如,假设您有一个类型为 double 的字段,其中它必须有一个奇数整数部分。您将showFps设置为私有,然后通过直接getter和验证资源库访问它(此处以Java语法显示):

void setF(double f_) throws IllegalArgumentException { 
    int ip=(int) f;
    if(ip%2!=1) throw new IllegalArgumentException();
    this.f = f_; 
}

二传手可以执行诸如更新间接受影响的其他字段(例如上次更改时间戳)之类的操作。无论如何,例如,如果您曾经必须更新内部代码以使用 BigInteger,那么通过外部双精度获取和设置的能力可以防止类的用户中断您的更改。

C# 可能会为此使用属性。

我假设你的意思是为什么要封装一个私有变量?

有几个原因:

  1. 验证逻辑 - 使用显式资源库,您可以控制字段可以设置为的有效值范围。 如果有人尝试设置无效值,您可以引发异常。

  2. 隐藏对象如何实现其协定。 这使您可以在以后更改类的工作方式,而不会破坏依赖于您的实现的其他代码。

  3. 以原子方式执行多个更新。 更复杂的操作可能无法"同时"完成。 通过使用同步和锁定机制,可以在多线程环境中允许安全发布。

它都基于encapsulationabstraction概念:将数据和代码组合/绑定在一起,这样您的代码就不会被意外更改。 将变量设为私有/外部无法访问可以直接防止数据的意外修改(通过提供getter/setter/methods反过来访问数据)。 NOTE:面向对象编程更多地面向数据而不是代码。

最新更新