代码之家  ›  专栏  ›  技术社区  ›  Shamika

JIT编译器如何决定何时初始化静态构造函数

  •  0
  • Shamika  · 技术社区  · 15 年前

    最近,我在使用.NET3.5开发的一个应用程序中观察到了以下有趣的场景。在这个特殊的UALR应用程序中,我有一个作为静态变量访问的Singleion对象。我举例说明了.NET运行时应该在我第一次访问它时初始化这个单例对象,但似乎不是这样。NET运行时在访问此particualr对象之前对其进行初始化。下面是一些培多代码,

    if(!initSingleton)
       //Do some work without using the singletion class.
    else
       //Do some work using the singletion class.
    

    即使在运行时,我的代码也只执行if语句中的代码。NET运行时仍然初始化singleton对象。在一些应用程序运行中,我根本不需要访问这个pariticualr对象!

    更新:

    private void InitServiceClient(NetworkCredential credentials, bool https)
            {
                string uri = currentCrawlingWebUrl;
                if (!uri.EndsWith("/"))
                    uri = string.Concat(uri, "/");
                uri = string.Concat(uri, siteDataEndPointSuffix);
    
                siteDataService = new SiteData.SiteDataSoapClient();
                siteDataService.Endpoint.Address = new EndpointAddress(uri);
    
                if (credentials != null)
                {
                    siteDataService.ClientCredentials.Windows.ClientCredential = credentials;
                }
                else if (MOSSStateHandler.Instance.UserName.Length > 0 && MOSSStateHandler.Instance.Password.Length > 0)
                {
                    siteDataService.ClientCredentials.Windows.ClientCredential.UserName = MOSSStateHandler.Instance.UserName;
                    siteDataService.ClientCredentials.Windows.ClientCredential.Password = MOSSStateHandler.Instance.Password;
                    siteDataService.ClientCredentials.Windows.ClientCredential.Domain = MOSSStateHandler.Instance.Domain;
                }
    
                BasicHttpBinding httpBinding = (BasicHttpBinding)siteDataService.Endpoint.Binding;
                httpBinding.Security.Mode = (https ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.TransportCredentialOnly);
    
                string authmode = MOSSConnectorConfiguration.Instance.Config.GetString(ConfigConstants.SHAREPOINT_AUTH_PROVIDER, "ntlm");
                if (authmode.Equals("ntlm", StringComparison.OrdinalIgnoreCase))
                    httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
                else if (authmode.Equals("kerberos", StringComparison.OrdinalIgnoreCase))
                    httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                else
                    throw new Exception(string.Format("Not supported"));
            }
    

    即使我的应用程序不执行else中的代码,如果阻止初始化类MOSSStateHandler。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Ron Klein Noa Kuperberg    15 年前

    我建议你读乔恩·斯基特的 article 关于C#中的单例模式,以及 its appendix 关于延迟加载等。您将更好地了解实现问题。

        2
  •  2
  •   Pang firemonkey    7 年前

    C# language spec :

    类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

    • 将创建该类的一个实例。