Mi sono imbattuto in un problema in cui ho bisogno di un'istanza della classe all'interno del suo costruttore statico. Ho creduto che non era possibile farlo così ho provato la seguente:È sicuro per una classe creare istanze di se stesso all'interno del costruttore statico?
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Foo.someString);
Console.ReadLine();
}
}
class Foo
{
public static readonly string someString;
static Foo()
{
someString = new Foo().CreateString();
}
private string CreateString()
{
return "some text";
}
}
Con mia grande sorpresa, funziona - l'uscita è "un testo". Credevo che il costruttore statico debba essere eseguito e completato prima di poter creare istanze della classe. This answer mostra che questo non è necessariamente il caso. Questo significa che i costruttori statici e di istanze sono indipendenti l'uno dall'altro? E infine, è sicuro farlo (creare istanze nel costruttore statico)?
p.s. Ignoriamo il fatto che questo può essere evitato utilizzando un approccio diverso.
a seconda della definizione di sicurezza, l'ubicazione dell'istanza e l'utilizzo dell'istanza creata –
@Rune FS: fare una cosa simile come nell'esempio: inizializzare una variabile membro statica – loodakrawa
Fare attenzione quando i costruttori statici dipendono da altri costruttori statici. Cerca di non ottenere una dipendenza circolare, perché ciò può causare l'accesso ai membri e creare istanze della classe prima che l'inizializzatore statico abbia completato l'esecuzione. Il Framework non ti avviserà per questo (cioè, nessuna eccezione o deadlock). – Ruben