我正在对实时游戏进行多线程处理,并且希望防止一个线程上的对象的状态变量被另一个线程设置。这将使预防比赛条件变得容易得多。
但是,我仍然希望能够读取其他对象的状态。我打算使用双缓冲系统,其中一个状态对象用作前缓冲区并进行状态更改,而另一个状态对象用作后缓冲区并为其他对象提供(先前帧的)状态。我需要能够从后缓冲区读取状态信息,以便在前缓冲区中进行更改。
问题在于,即使变量设置器是私有的,也可以从同一类的另一个对象进行更改。
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";
}
}
答案 0 :(得分:2)
可能不是最直接的解决方案,但是保护属性的一种方法是使用接口。
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
}
}
答案 1 :(得分:0)
可以从同一类的另一个对象进行更改。
您不能停止自己的课程设置私人设置者。
我的意思是,毕竟您是该课程的作者,您只需要担心的手指。
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;
}
答案 2 :(得分:0)
如果您正在编写一个类,则假定您将使类按您希望的方式工作。将内容设为私有的目的是为了防止您的同事(或客户)在自己的班级/功能/模块上工作时破坏班级的关注。
说“我不想做这个事”。有点漏了点。
那是说,一般来说,对于宽松的语言来说,这很不错,因为它们可以防止您的同事编写糟糕的代码或非惯用语代码。其他答案显示了成语,您可以使用这些成语,这会使您的同等人以后很难编辑,从而破坏了您的优美样式。 Anu Viswan's得到我的投票。
答案 3 :(得分:0)
添加字段 this0 = this ,然后在设置器中检查 this == this0。