如何,从静态方法;访问静态方法中使用的静态属性的唯一值

时间:2015-09-24 22:37:33

标签: c# class methods static

我想在相同主题上运行的其他静态方法中访问静态字段的值。一个例子在下面的代码中:

此脚本中的第一个类是ClassA。 ClassA的工作是比较两个Rect值,如果两个比较Rect值之间存在不等式,则公共布尔值设置为true;

在classA中,IsRectChanged是一个bool方法,它接受Rect类型的参数对象,并将其与StoredRect进行比较,即Rect。当storedRectRect的{​​{1}}值不匹配时,该方法返回true。

IsRectChanged

这是 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中创建了一个名为ClassA的{​​{1}}静态字段。 不要更改ClassB中isRectChanged的结构。考虑到静态和非静态类中的50个其他方法必须使用ClassB字段。需要改变MethodB的结构以使代码工作是适得其反的。

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并在参数{{1}中分配ClassE }}

由于ClassB.MethodBnew RectMethodB被称为ClassC,并在ClassD的参数中分配ClassE。它们均覆盖静态字段ClassB.MethodB的{​​{1}}值。

因此,new Rect MethodB将永远为真。

如何解决此问题,而无需storedRect ClassA RectHelperClassA' RectHelper.IsRectChanged非静态?**

ClassB

此处ClassA ClassE在两个MethodB方法中调用,其中一个方法接受int参数。如果同时调用它们,它们会互相覆盖,因此系统会认为 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)); } } 为真,并且将始终返回true。这是一个大问题。

我们不希望覆盖ClassE,我们希望将ClassB.MthodB的每个调用视为不是静态的,以便UpdateEverFrame永远不会被覆盖

IsRectChanged

在我的问题中当我说“访问静态属性的唯一值”时。我在谈论IsRectChanged

我知道ClassB.MethodB是STATIC,因此只要他们调用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和ClassE之间共享该值。但是,我们可以解决此问题,以便ClassB.RectHelperClassC不会覆盖ClassA中的ClassD值吗?

3 个答案:

答案 0 :(得分:0)

我没有达到目的,但您是否考虑过让ClassB通用?这样的事情:

    public class ClassB<T>
    {
        private static ClassA if_rect_Changed = new ClassA();

        public static void MethodB(Rect yourRect)
        {
            if (if_rect_Changed.RectChanged(yourRect))
            {
                Debug.Log("Changes were made");
            }
        }

    }

并按照它使用它:ClassB<ClassC>.MethodB(rect)所以每个班级都会拥有“更改跟踪器”的“副本”,您将能够保持MethodB静态。

答案 1 :(得分:0)

为什么不跳过静态类B,只在类C和D中创建类A的静态属性。你编写代码的方式似乎搞砸了。我要处理的另一种方法是做类似的事情:

public class ClassA
{
    protected Rect storedRect;

    public ClassA() { }

    public virtual void UpdateEverFrame();

    protected bool IsRectChanged(Rect rect)
    {
        bool isChanged = !rect.Equals(StoredRect);
        if(isChanged)
        {
            storedRect = rect;
        }

        return isChanged;
    }
}

public class ClassC : ClassA
{
    public override void UpdateEverFrame()
    {
        if(IsRectChanged(new Rect(0, 0, 20, 20)))
        {
             Debug.Log("Changes were made class C");
        }
    }
}
public class ClassD : ClassA
{
    public override void UpdateEverFrame()
    {
        if(IsRectChanged(new Rect(100, 100, 10, 10)))
        {
             Debug.Log("Changes were made class D");
        }
    }
}

答案 2 :(得分:0)

首先澄清一些。我假设您正在使用System.Windows.Rect,对吗?更多澄清......

  

我们在ClassB中有ClassA的静态属性,名为 isRectChanged

不,您在ClassB中有一个类型为ClassA的静态字段,名为 RectHelper IsRectChanged 是ClassA的非静态方法。

  

我们希望在相同主题上运行的其他静态方法中访问静态属性的值。

由于它们位于相同的线程,因此您无法同时调用静态方法。到目前为止,没问题。

  

他们都调用 ClassB.MethodB 并覆盖 MethodB的Rect parmeter 的值。这两个类都使用相同的ClassB.MethodB ...

实例

他们没有覆盖 Rect 参数,而是提供 Rect 对象。 ClassB 是实例,而不是ClassB.MethodB

  

......永远都是真的。

不是那么,请尝试运行下面的代码,您会看到只有第一个调用返回 true

ClassC c = new ClassC();
c.UpdateEverFrame();
c.UpdateEverFrame();
c.UpdateEverFrame();

但如果你在行之间通过 ClassD 插入来电,是的,IsRectChanged会返回 true ,因为它是真的, Rect 实际上是不同的。但是,这就是静态的用途,即 Singleton 类型操作。

如果你想要一个每个类静态变量,那么在每个类中放一个静态变量。如果这需要您复制代码,请使用模板。它不一定要花哨,例如,只需更改 ClassB 以及调用 ClassB 的方法,如下所示......

public class ClassB<TClass> // the rest of the class is the same
...
/* in ClassC */ ClassB<ClassC>.MethodB(new Rect(...));
...
/* in ClassD */ ClassB<ClassD>.MethodB(new Rect(...));

通过将 ClassB 添加到模板中,每个ClassB&lt;&gt;是一个不同的静态对象,每个对象都有自己的静态变量副本。现在,以下代码将为 ClassC ClassD 上的第一次调用返回 false

        ClassC c = new ClassC();
        c.UpdateEverFrame();
        c.UpdateEverFrame();
        c.UpdateEverFrame();
        ClassD d = new ClassD();
        d.UpdateEverFrame();
        d.UpdateEverFrame();
        c.UpdateEverFrame();
        d.UpdateEverFrame();

以下是课程......

public static class ClassB<TClass>
{
    private static ClassA RectHelper = new ClassA();

    public static void MethodB(Rect yourRect)
    {
        if (RectHelper.IsRectChanged(yourRect))
        {
            Debug.WriteLine("Changes were made");
        }
    }
}

public class ClassC
{
    public void UpdateEverFrame()
    {
        ClassB<ClassC>.MethodB(new Rect(0, 0, 20, 20));
    }
}
public class ClassD
{
    public void UpdateEverFrame()
    {
        ClassB<ClassD>.MethodB(new Rect(100, 100, 10, 10));
    }
}