我可以防止私有变量被同一 class 的其他对象更改吗?
Can I prevent a private variable from being changed by other objects of the same class?
我正在对一个实时游戏进行多线程处理,我想防止一个线程上的对象的状态变量被另一个线程设置。这将使防止竞争条件变得容易得多。
不过,我仍然希望能够读取其他对象的状态。我打算使用双缓冲区系统,其中一个状态对象用作前缓冲区并进行状态更改,而另一个用作后缓冲区并向其他对象提供(前一帧的)状态。我需要能够从后缓冲区读取状态信息以在前缓冲区中进行更改。
问题是,即使变量 setter 是私有的,也可以从同一 class 的另一个对象更改它。
public class State
{
//Some example state information
public string StateVar1 { get; private set; }
//This method will be farmed out to multiple other threads
public void Update(State aDifferentStateObject)
{
StateVar1 = "I want to be able to do this";
string infoFromAnotherObject = aDifferentStateObject.StateVar1; //I also want to be able to do this
aDifferentStateObject.StateVar1 = "I don't want to be able to do this, but I can";
}
}
it's possible to change it from another object of the same class.
您无法阻止自己的 class 设置私有设置器。
我的意思是毕竟你是那个class的作者,你只需要担心你的手指。
public class SomeOtherNonRelatedClass
{
public void Update(State aDifferentStateObject)
{
// the world is as it should be
aDifferentStateObject.StateVar1 = "bang!!!" // compiler error
}
}
如果您想防止自己更改自己的成员,请使用扩展方法
public class Extensions
{
public void Update(this State aDifferentStateObject)
{
// the world is as it should be
aDifferentStateObject.StateVar1 = "bang!!!" // compiler error
}
}
或使其真正只读(尽管可能没有用)
public string StateVar1 { get; }
或支持字段,因此您可以在内部设置它
private string backingField;
public string StateVar1
{
get => backingField;
}
可能不是最直接的解决方案,但保护属性的一种方法是使用接口。
public interface IState
{
string StateVar1 { get; }
}
public class State:IState
{
//Some example state information
public string StateVar1 { get; private set; }
//This method will be farmed out to multiple other threads
public void Update(IState aDifferentStateObject)
{
StateVar1 = "I want to be able to do this"; // Allowed
string infoFromAnotherObject = aDifferentStateObject.StateVar1;
aDifferentStateObject.StateVar1 = "I don't want to be able to do this, but I can"; // NOT allowed
}
}
如果您正在编写 class,则假定您将使 class 按照您希望的方式工作。将内容设为私有的目的是防止您的同事(或客户)在他们自己 classes/functions/modules.
工作时破坏您的 class 的顾虑
说 "I don't want to be able to do this thing." 有点离题了。
就是说,一般而言,不太宽松的语言的好处在于,它们可以防止您的同事编写蹩脚或非惯用代码。其他答案显示了您可以使用的习语,这些习语会让您的同龄人以后更难编辑打破您漂亮优雅的模式。 投我一票。
添加字段 this0=this 并在 setter 中检查 this==this0.
我正在对一个实时游戏进行多线程处理,我想防止一个线程上的对象的状态变量被另一个线程设置。这将使防止竞争条件变得容易得多。
不过,我仍然希望能够读取其他对象的状态。我打算使用双缓冲区系统,其中一个状态对象用作前缓冲区并进行状态更改,而另一个用作后缓冲区并向其他对象提供(前一帧的)状态。我需要能够从后缓冲区读取状态信息以在前缓冲区中进行更改。
问题是,即使变量 setter 是私有的,也可以从同一 class 的另一个对象更改它。
public class State
{
//Some example state information
public string StateVar1 { get; private set; }
//This method will be farmed out to multiple other threads
public void Update(State aDifferentStateObject)
{
StateVar1 = "I want to be able to do this";
string infoFromAnotherObject = aDifferentStateObject.StateVar1; //I also want to be able to do this
aDifferentStateObject.StateVar1 = "I don't want to be able to do this, but I can";
}
}
it's possible to change it from another object of the same class.
您无法阻止自己的 class 设置私有设置器。
我的意思是毕竟你是那个class的作者,你只需要担心你的手指。
public class SomeOtherNonRelatedClass
{
public void Update(State aDifferentStateObject)
{
// the world is as it should be
aDifferentStateObject.StateVar1 = "bang!!!" // compiler error
}
}
如果您想防止自己更改自己的成员,请使用扩展方法
public class Extensions
{
public void Update(this State aDifferentStateObject)
{
// the world is as it should be
aDifferentStateObject.StateVar1 = "bang!!!" // compiler error
}
}
或使其真正只读(尽管可能没有用)
public string StateVar1 { get; }
或支持字段,因此您可以在内部设置它
private string backingField;
public string StateVar1
{
get => backingField;
}
可能不是最直接的解决方案,但保护属性的一种方法是使用接口。
public interface IState
{
string StateVar1 { get; }
}
public class State:IState
{
//Some example state information
public string StateVar1 { get; private set; }
//This method will be farmed out to multiple other threads
public void Update(IState aDifferentStateObject)
{
StateVar1 = "I want to be able to do this"; // Allowed
string infoFromAnotherObject = aDifferentStateObject.StateVar1;
aDifferentStateObject.StateVar1 = "I don't want to be able to do this, but I can"; // NOT allowed
}
}
如果您正在编写 class,则假定您将使 class 按照您希望的方式工作。将内容设为私有的目的是防止您的同事(或客户)在他们自己 classes/functions/modules.
工作时破坏您的 class 的顾虑
说 "I don't want to be able to do this thing." 有点离题了。
就是说,一般而言,不太宽松的语言的好处在于,它们可以防止您的同事编写蹩脚或非惯用代码。其他答案显示了您可以使用的习语,这些习语会让您的同龄人以后更难编辑打破您漂亮优雅的模式。
添加字段 this0=this 并在 setter 中检查 this==this0.