有没有办法保护 class 变量不被函数外修改

Is there a way to protect a class variable from being modified outside of a function

我有一个卷变量,我想保护它不被修改,除非该人调用某个函数。除了在 class 中创建私有 class 之外,有没有办法让它只能被该函数修改。我想创建一个 private class 是个好主意,但如果其他人有不同的方法,我会很感兴趣。决不允许 AudioPlayer 在不调用 SetVolume 的情况下更改音量。这是我这里的代码,但我想知道人们是否有不同的方法。

public class AudioPlayer
{
    private class VolumeManager
    {
        private AudioPlayer mAudioPlayer;
        public VolumeManager(AudioPlayer audioPlayer)
        {
            mAudioPlayer = audioPlayer;
        }

        private float volume;

        public void SetVolume(float _volume)
        {
            volume = _volume;

            //Do other necessary things that must happen when volume is changed
            //This is the point of the question
            mAudioPlayer.ModifyChannelVolume(Volume);
        }
        public float GetVolume()
        {
            return volume;
        }
    }

    private VolumeManager mVolumeManager;
    public AudioPlayer()
    {
        mVolumeManager = new VolumeManager(this);
    }

    public void ModifyVolume(float volume)
    {
        mVolumeManager.SetVolume(volume);
    }
}

或许,你可以将Volume变量声明为private,只在函数内部修改变量,然后用一个属性暴露Volume字段。

private float Volume;  
public float pVolume
    {
        get
        {
            return Volume;
        }
    }

在我看来,问题是即使有一个私有字段,想要直接分配给该字段仍然有些直观和自然。我们要确保这不会发生。在那种情况下,我建议将其构建为 属性,而不是字段,并且只对 属性:

进行分配
public class AudioPlayer
{

    public float Volume 
    {
       get { return _volume_NeverSetThisDirectly;}
       set 
       {
           _volume = value;
           //Do other necessary things that must happen when volume is changed
           ModifyChannelVolume(_volume_NeverSetThisDirectly);
       }
    }
    [Browsable(false)]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    [EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    private float _volume_NeverSetThisDirectly; //Never assign to this directly!
}

这不会将其强制执行到您要求的程度,但它确实翻转了某人在此 class 中工作的直观和自然的方式,以正确的方式使用值,而不是比错误的方式。这也大大减少了代码和维护的复杂性。添加属性在很大程度上不会影响已经在此 class 工作的人的事情,但由于我们正在改变以使用社会压力而不是技术禁令,所以我们设置的警告标志越多越好。

这也为您在未来发现一个奇怪的情况提供了一个机会,您确实想要更改体积场而不发生所有其他事情,您可以这样做而无需做奇怪的事情私有 class 实例。