如何避免此代码中的静态变量

时间:2014-04-30 12:31:21

标签: c# optimization static

我有一个实现IComparable接口的类,但我的CompareTo函数使用一个静态变量,例如类看起来像这样

MyClass : IComparable
{
   CompareTo(MyClass that)
   {
     ....
    double a = SomeOtherClass.staticVariable; 
     ....
   }
}

或者这里是真正的代码

  SomeOtherClass
  {
  someMethod()
  {
        foreach (Vertex v in events)
        { 
            sweepLineX = v.VPoint.X; //sweepLineX is static!!!
            ...
            e1.Key = new MyClass(point1, point2); 
        // here i create key of MyClass type which is used to store item in BST
        }
   }

有没有办法避免使用该静态变量?我想过使用MyClass的字段来保存staticVariable的值,但我会有大约200k的MyClass实例,所以需要空间来为它存储一个额外的double值。 显而易见的解决方案是将其作为参数插入,但我不能,因为CompareTo方法来自接口,而不是我的方法。

2 个答案:

答案 0 :(得分:0)

您可以应用Inversion of control原则。这提供了删除MyClass和静态类之间的硬链接的可能性。

1)将此常量传递给方法作为参数。(它不是更好)

MyClass : IComparable
{
    CompareTo(MyClass that, double yourConstant)
    {
        ....
        double a = yourConstant; 
        ....
    }
}

2)将此变量作为Property传递。     MyClass:IComparable     {         double YourConstant {get;设置;}

    CompareTo(MyClass that)
    {
        ....
        double a = YourConstant; 
        ....
    }
}

3)将此变量作为构造函数参数传递。

MyClass : IComparable
{
    public MyClass(double constant)
    {
        _yourConstant = constant;
    }

    private double _yourConstant;

    CompareTo(MyClass that)
    {
        ....
        double a = _yourConstant; 
        ....
    }
}

答案 1 :(得分:0)

为什么不创建一个界面。

IComparable只是一个带

的界面
int CompareTo(object obj);

返回0, -1, 1

只需使用此功能创建IMyComparable

int CompareTo(object obj, int someThingExternal)

IMyComparable

中导出您的课程

如果你不介意牺牲一些遗产。假设MyClass不需要派生自任何其他类。

abstract class MyCompare : IComparable
{
    int CompareTo(Object that)
    {
        return CompareTo(that, YOURSTATICVARIABLE);
    }

    abstract int CompareTo(Object that, int somethingExternal);
}

MyCompare

中获取您的课程
MyClass : MyCompare