【问题标题】:What are the steps to convert a large class from static to non-static? [closed]将大类从静态转换为非静态的步骤是什么? [关闭]
【发布时间】:2011-10-06 15:19:45
【问题描述】:

我有一个相当大的开源类,我需要将其从静态转换为非静态。

我需要这样做的原因是让它线程安全;我想要每个线程一个类的副本。

一般来说,将 C# 库从静态转换为非静态的推荐步骤是什么?

【问题讨论】:

  • 嗯,这个问题太笼统了。贴一些代码,你会得到更好的答案。
  • 这是 waaaaaay 太宽泛,无法有效回答。暂时忘记一些要应用或删除的一般构造(为了争论,我假设您已经知道),其他一切都纯粹是您的场景(或一组这样的场景)的间接情况。也就是说,您需要的不仅仅是一种使类成为非静态的方法,您还需要确保它线程安全的:这不仅仅是实例类的结果。
  • 查找“静态”替换为“”
  • @Mr.Disappointment - 也许您没有注意到我在该评论中使用的 Tounge in Cheek 格式。

标签: c# .net multithreading static


【解决方案1】:

我已将数据层从静态升级为无静态类。所以

第一个:删除类和方法上的“静态”关键字

第二个:在你的旧静态类中添加一个 Singleton

public class Foo 
{

    #region Singleton

    Foo()
    {
    }

    public static Foo Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        static Nested() { }

        internal static readonly Foo instance = new Foo();
    }

    #endregion

3rd : 在每次调用中用 Foo.Instance.DoSomething() 代替 Foo.DoSomething()

4th : 编译并获利

【讨论】:

    【解决方案2】:

    让它编译?从所有成员中删除static 应该这样做。

    如果你想要更洁净的东西,那么你应该从所有调用中获取公共参数并将它们移动到构造函数中。

    对我来说似乎很简单。您对此有什么具体问题吗?

    【讨论】:

      【解决方案3】:

      我认为您的意思是,由于这是一个如此庞大的课程,因此很难想象一下如何一次性完成,因此您希望遵循一些步骤。如下:

      1. 转换为单例
      2. 您需要通过替换每个术语来更正引用静态类的位置 MyClass 与单例吸气剂 MyClass.instance()。保留所有这些地点的清单,以便您可以轻松地重新访问它们。
      3. 在您找到的所有这些地方,找出如何最好地依赖注入 MyClass.instance() 而不是使用 MyClass 全局引用它。
      4. 将您的类取消单例化为规范类。您所做的 DI 工作应该可以轻松地从单例 getter 转换为普通构造函数。
      5. 现在开始一次使用多个实例,并修复由此导致的高级并发问题。

      在每个步骤之间运行您的测试框架。

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多