2011-06-16 12 views
5
public class MyClass<T> 
{ 
    public static readonly String MyStringValue; 

    static MyClass() 
    { 
     MyStringValue = GenerateString(); 
    } 

    private static String GenerateString() 
    { 
     //Dynamically generated ONCE per type (hence, not const) 
    } 

    public void Foo() 
    { 
     Console.WriteLine(MyStringValue); 
    } 
} 

Tengo entendido que el string de solo lectura estático no se generará hasta que se llame al constructor estático en la clase. Pero el constructor estático no se invocará hasta que se acceda a uno de los métodos o variables estáticos.C# - Cadenas de solo lectura estáticas - ¿Es posible ejecutar problemas de subprocesos múltiples?

En un entorno de subprocesos múltiples, ¿es posible tener problemas debido a esto? Básicamente, ¿el constructor estático está bloqueado de forma predeterminada por singleton o tengo que hacer esto yo mismo? Es decir ... tengo que hacer lo siguiente:

private static Object MyLock; 

static MyClass() 
{ 
    lock(MyLock) 
    { 
     if (MyStringValue == null) 
      MyStringValue = GenerateString(); 
    } 
} 
+0

posible duplicado de [¿Es seguro el hilo del constructor estático C#?] (Http://stackoverflow.com/questions/7095/is-the-c-static-constructor-thread-safe) –

Respuesta

8

Se garantiza que el constructor estático se ejecutará solo una vez por tipo instanciado. Entonces no necesitas tu bloqueo.

Tenga en cuenta que se ejecutará una vez para cada parámetro genérico. Y los campos estáticos en la clase genérica tampoco se comparten entre diferentes parámetros genéricos.

1

Para evitar esto, ¿por qué no convertir el valor en una propiedad estática con solo un acceso de acceso que devuelve el valor almacenado en la memoria caché, que luego puede volverse privado? Acceder a la propiedad get aseguraría que el constructor estático se ejecutara primero.

Cuestiones relacionadas