【问题标题】:Shall I use static here or not?我应该在这里使用静态吗?
【发布时间】:2015-08-20 20:47:15
【问题描述】:

我已经阅读了静态的优点/缺点,但从性能的角度来看,我不确定在我的情况下如何做到这一点。

我有一个classA 有不同的变量,还有函数定时器

class ClassA
{
    // More vars...
    private System.Timers.Timer _values;
    public ClassA(IntPtr handle, String t)
    {
        _handle = handle;
        _title = t;
        CheckRoutineAndContinue();     
    }

CheckRoutineAndContinue 在哪里:

    private void CheckRoutineAndContinue()
    {
        _values= new System.Timers.Timer();
        _values.Elapsed += delegate { Check(); };
        _values.Interval = 200;
        _values.AutoReset = false;
        _values.Start();
    }

    private void Check()
    {
        if (_max> 5) StopCheck();
        else
        {
            // Logic...
        _max++;
    }

    private void StopCheck()
    {
        if (_values!= null)
        {
            _values.AutoReset = false;
            _values.Enabled = false;
            _values.Stop();
        }
    }

我的问题是:我将拥有多个 ClassA 对象。如果我为CheckRoutineAndContinue() 创建一个静态方法,它只会创建一次,我可以将我需要使用的参数传递给它,而如果我在我的类中有它,我不需要发送 ClassA 的变量并将只能创建一次。所有 ClassA 对象执行的代码都是相同的,但每个对象的变量值不同。

这是创建静态方法并以某种方式通过参数传递所有变量的好时机,因此这些函数只创建一个,还是建议将这些函数放在同一个类中,即使它们将被创建每次我创建一个新的 ClassA 对象?

假设在这种情况下测试没什么大不了的。

我会假设静态方法会更好,因为每次都会再次创建函数,但我不是 100%,而且我不确定静态方法是否可以正确处理计时器,因为我需要根据需要启动-停止它关于定时器内部函数的逻辑。

【问题讨论】:

  • 如果您使用静态函数,它可能确实(一点点)更快,但您将失去对类成员变量的访问权限。在大多数情况下,这将严重违反 OOP。
  • 如果您有“哪个更快”的性能问题,获得正确答案的方法是测试这两种方法。
  • @Blorgbeard 好吧,我也想知道这样做的“正确方法”是什么。但是,是的,你的答案也是正确的。
  • 糟糕,我的错,是的,您也可以访问私人成员。但是,这仍然会导致非常尴尬的编程。

标签: c# multithreading timer static


【解决方案1】:

我看不出在这里使用静态有什么真正的好处。我不同意你的表现会得到改善;你仍然会做同样的事情。

一般来说,使用静态变量有两个原因:(1)您希望某物成为单例对象(例如,整个应用程序共享的某些数据的位置;或(2)所涉及的方法不会改变任何状态类,因此标记为静态,因为这在一定程度上优化了内存中类实例的创建(以非常小的方式)。

【讨论】:

  • I don't agree that your performance would be improved: 在这种情况下,OP 需要做一些额外的努力,也许是真的。但总的来说,静态函数 a (稍微[即此处对 OP 无效]) 更快。见stackoverflow.com/questions/169378/…
  • 我喜欢你的定义。对于单例对象,这很清楚。对于(2),我假设静态方法是不需要对类信息(变量等)进行任何操作的方法,只需要调用它(可能带有参数,但仅此而已,从那时起,它将自行继续,无需与班级互动。我没听错吗?非常感谢!
  • 法学博士是的,静态方法没有“this”指针,不能修改类实例的状态。我认为当你有这样的方法时,最好将它们标记为静态以用于文档目的。
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多