有没有办法保护 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 实例。
我有一个卷变量,我想保护它不被修改,除非该人调用某个函数。除了在 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 实例。