【发布时间】:2015-12-22 16:32:04
【问题描述】:
我想在同一线程上运行的其他静态方法中访问静态字段的值。下面的代码中有一个例子:
这个脚本中的第一个类是ClassA。 ClassA 的工作是比较两个 Rect 值,如果两个比较的 Rect 值之间存在不等式,则将公共布尔值设置为 true;
在 classA 中,IsRectChanged 是一个 bool 方法,它接受 Rect 类型的参数对象并将其与 StoredRect 进行比较,Rect。当storedRect 与IsRectChanged 的Rect 值不匹配时,该方法返回true。
public class ClassA
{
private Rect storedRect;
public ClassA() { }
public bool IsRectChanged(Rect rect)
{
bool isChanged = !rect.Equals(storedRect);
if(isChanged)
{
storedRect = rect;
}
return isChanged;
}
}
这是ClassB
我们在ClassB 中创建一个名为isRectChanged 的ClassA 静态字段。
请勿更改 ClassB 中 MethodB 的结构。考虑静态和非静态类中的 50 种其他方法必须使用 ClassA 字段这一事实。需要更改ClassB 的结构以使代码正常工作会适得其反。
public static class ClassB
{
private static ClassA RectHelper = new ClassA();
public static void MethodB(Rect yourRect)
{
if(RectHelper.IsRectChanged(yourRect))
{
Debug.Log("Changes were made");
}
}
}
ClassC、ClassD和ClassE在同一个线程上运行。它们都调用ClassB.MethodB并在MethodB的参数中分配一个new Rect。
因为ClassC,ClassD和ClassE被调用ClassB.MethodB并在MethodB的参数中分配一个new Rect。它们各自覆盖静态字段ClassA RectHelper 的storedRect 值。
因此,ClassA RectHelper.IsRectChanged 将永远为真。
如何解决这个问题而不必使ClassB 的ClassA 和ClassE 的MethodB 成为非静态的?**
public class ClassC
{
public void UpdateEverFrame()
{
ClassB.MethodB(new Rect(0, 0, 20, 20));
}
}
public class ClassD
{
public void UpdateEverFrame()
{
ClassB.MethodB(new Rect(100, 100, 10, 10));
}
}
这里在ClassE ClassB.MthodB 中被两个UpdateEverFrame 方法调用,其中一个接受一个int 参数。如果同时调用它们,它们会相互覆盖,因此系统会认为IsRectChanged 为真,并且始终返回真。这是个大问题。
我们不希望IsRectChanged 被覆盖,我们希望ClassB.MethodB 的每个调用都被视为不是静态的,因此IsRectChanged 永远不会被覆盖
public class ClassE
{
public void UpdateEverFrame()
{
ClassB.MethodB(new Rect(0, 0, 20, 20));
}
public void UpdateEverFrame(int i)
{
ClassB.MethodB(new Rect(100, 100, 10, 10));
}
}
在我的问题中,当我说“访问静态属性的唯一值”时,我指的是ClassB.RectHelper。
我知道 ClassB.RectHelper 是 STATIC,因此无论何时调用 MethodB,该值都将在 ClassC、ClassD 和 ClassE 类之间共享。但是我们能否解决这个问题,以便 ClassC 和 ClassD 不覆盖 ClassA 中的 storedRect 值?
【问题讨论】:
-
请更好地描述您想要做什么。考虑提供一些代码来显示你得到的结果与你想要得到的结果形成对比。
-
我更改了问题并添加了更多信息,请参阅 ClassE 和上面的描述
-
对我们帮助您仍然没有帮助。你试过调试器吗?