none
一个类的静态构造函数被调用多次, 是什么原因? RRS feed

  • 问题

  • UserMgr是一个普通类, 由于有一个静态字段, 我在静态构造函数中初始化该字段

     static UserMgr()
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("thread id:" + Thread.CurrentThread.ManagedThreadId);
                Console.WriteLine("appdomain:" + AppDomain.CurrentDomain.FriendlyName);
                Console.WriteLine("UserMgr static ctor:" + instanceGuid);
                Console.ResetColor();
                userDict = ooxx...;
            }

    后来发现, userDict这个静态字段在运行的时候居然有多份实例

    跟着发现
    静态构造函数被调用了两次,分别是
    thread id:15
    appdomain:HostDomain
    UserMgr static ctor:da5fe1f6-9523-41be-b4f8-a88aa72085c2


    thread id:13
    appdomain:HostDomain
    UserMgr static ctor:c9503d51-af87-436e-a666-6623ad96a3fc

    请教大家可能是什么原因造成的呢?
    我知道如果多个域的话,肯定会是多个实例, 但现在域的话我可以保证是同一个域, 该静态字段也没有加[ThreadStatic]特性, 请问还有什么原因会导致静态构造函数调用多次呢?
    2011年1月18日 3:43

答案

全部回复

  • 补允一下, 消费该类的客户有在自身程序集中的, 也有在别的程序集中的, 自身程序集中的消费者访问到的是一个实例, 别的程序集中的消费者访问到的是一个实例
    2011年1月18日 3:46
  • 解决了么?

    unity 等依赖注入容器会创建新的临时类型, 但是如果你子类访问的是 原类性的static字段 应该也不会有什么问题。

     

    建议少用静态 多用singleton


    入了ipad,最近用ipad上论坛
    2011年1月18日 5:03
    版主
  • 是我傻了, 在wcf里把dll文件读到byte[]里再load assembly, 所以导致两份实例
    2011年1月18日 5:30
  • 是我傻了, 在wcf里把dll文件读到byte[]里再load assembly, 所以导致两份实例


    呵呵~ 原来是这样 

    很宝贵的经验  让大家可以参考自己可能遇到的盲点~


    入了ipad,最近用ipad上论坛
    2011年1月18日 6:23
    版主