Недавно я заметил следующий интересный сценарий в одном из приложений, которые я разрабатываю с помощью .NET 3.5. В этом конкретном приложении у меня есть объект singleletion, к которому я обращаюсь как статическая переменная. Я выяснил, что время выполнения .NET должно инициализировать этот объект singleton в первый раз, когда я его получаю, но, похоже, это не так. .NET runtime инициализирует его, прежде чем я получу доступ к этому частному объекту. Ниже некоторый peudo код,Как компилятор JIT решает, когда инициализировать статические конструкторы
if(!initSingleton)
//Do some work without using the singletion class.
else
//Do some work using the singletion class.
Даже во время выполнения моего код выполняется только код в стороне, если заявление среды .NET еще инициализирует одноплодную объект. В некоторых запусках приложений мне вообще не нужно обращаться к этому объекту pariticualr!
Также я не вижу такого поведения с отладочными сборками. Кажется, что это связано с оптимизированными сборками (выпуски).
Является ли это ожидаемым поведением среды выполнения .NET?
Update:
Ниже фактический код,
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"));
}
Даже если мое приложение не выполняет код в сторону еще, если блокировать класс MOSSStateHandler инициализируются.
Можете ли вы объяснить нам причину, по которой вам нужно выполнить проверку и где вы выполняете этот код? Очень странно это делать, это пахнет плохим дизайном. – jmservera
Ну, я больше заинтересован в получении объяснения того, как .NET runtime инициализирует статические классы. Над кодом внутри метода и в зависимости от значения флага initSingletion мне нужно поддерживать некоторое состояние в моем приложении, используя этот статический класс. – Shamika
Можете ли вы опубликовать небольшую полную программу, демонстрирующую поведение, которое вы видите? Это поможет нам понять поведение. –