Kiedy mam klasę zawierającą konstruktor statyczny, czy ten konstruktor jest wywoływany, gdy zestaw zawierający klasę jest załadowany po raz pierwszy lub gdy trafia pierwsze odniesienie do tej klasy?Kiedy jest wywołany konstruktor statyczny w języku C#?
Odpowiedz
Kiedy klasa jest dostępna po raz pierwszy.
Static Constructors (C# Programming Guide)
Statyczny konstruktor służy do zainicjowania żadnych danych statycznych, lub do wykonywania określonych czynności, które musi wykonać tylko jeden raz. Jest wywoływana automatycznie przed utworzeniem pierwszej instancji lub odniesieniem do jakichkolwiek statycznych elementów.
To nie jest tak proste, jak można by się spodziewać pomimo prostej dokumentacji. Artykuł Jona Skeeta nr http://csharpindepth.com/Articles/General/Beforefieldinit.aspx zawiera szczegółowe informacje na ten temat.
Podsumowanie:
Statyczny konstruktor gwarantowana jest do wykonania natychmiast przed pierwszym odniesieniu do członka tej klasy - bądź tworzenia instancji lub własnej statycznej metody/właściwości klasy.
Należy zauważyć, że inicjatory statyczne (jeśli nie ma konstruktora statycznego) gwarantowane do wykonania w dowolnym momencie przed pierwszym odnośnikiem do określonego pola.
+1. Pokonaj mnie, ale tylko tak. ;) – AnthonyWJones
To bardzo ciekawa lektura, dziękuję panów. – Jason
Wymieniony artykuł jest teraz na stronie Jona Skeeta: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy
Konstruktor statyczny jest wywoływany przed użyciem czegokolwiek w klasie, ale dokładnie wtedy, gdy tak się dzieje, jest do wdrożenia.
Gwarantuje to wywołanie przed uzyskaniem dostępu do pierwszego elementu statycznego i przed utworzeniem pierwszej instancji. Jeśli klasa nigdy nie jest używana, konstruktor statyczny nie może być w ogóle wywołany.
Kiedy to się dzieje * nie jest * "aż do implementacji", jeśli implementacja jest zgodna ze specyfikacją ECMA C#: "Wykonanie statycznego konstruktora jest wyzwalane przez pierwsze z następujących zdarzeń, które mają wystąpić w domenie aplikacji: [1] powstaje instancja klasy. [2] Dowolny ze statycznych elementów klasy jest przywoływany. " (Sekcja 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH
@Luke: "Dokładny czas wykonywania statycznego konstruktora zależy od implementacji" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa
@Guffa: To może być interpretacja autora artykułu, ale nie znajdziesz tego w wersji Microsoft lub ECMA/ISO specyfikacji C#. – LukeH
W przypadku wywołania metody statycznej z klasy nadrzędnej, konstruktor statyczny nie zostanie wywołany, ale jest jawnie określony. Oto przykładowy konstruktor b nie jest wywoływany, jeśli wywołana jest metoda b.methoda().
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
- 1. Statyczny konstruktor klasy w VB
- 2. Konstruktor statyczny wywołany dwukrotnie dla usługi WCF PerSession
- 3. View.onDraw() --- kiedy zostanie wywołany?
- 4. Statyczny konstruktor jest wywoływany dwa razy w tym samym appdomain?
- 5. Dlaczego konstruktor statyczny nie jest wywoływany przed pierwszym wywołaniem metody klasy
- 6. Czy zostanie automatycznie wywołany konstruktor klasy podstawowej?
- 7. Czy konstruktor statyczny może zmniejszyć wydajność dostępu do metod statycznych?
- 8. Licznik statyczny w C++
- 9. Kiedy jest typ ogólny rozwiązany w języku C#?
- 10. Jaki jest cel zewnętrznych konstruktorów statycznych w języku C#?
- 11. kiedy funkcja zwraca odwołanie w języku C++
- 12. Statyczny element funkcji w języku Python?
- 13. Kiedy wywoływany jest Constructor?
- 14. Prywatny statyczny VB6 w C#?
- 15. C# Konstruktor w interfejsie
- 16. Dlaczego nie został wywołany konstruktor ruchu std :: string?
- 17. Co to jest "statyczny"?
- 18. Co to jest ".. ::." w języku C#?
- 19. Co jest użytecznością publicznych konstruktorów w klasach abstrakcyjnych w języku C#?
- 20. W języku C#, czy domyślny konstruktor generowany jest po zainicjowaniu elementów klasy?
- 21. C++ Java statyczny odpowiednik końcowy
- 22. Dlaczego nie jest wywoływany konstruktor statyczny w klasie używanej jako ogólny parametr typu?
- 23. Dlaczego deskryptor w języku Python __set__ nie zostanie wywołany
- 24. C++ Friend konstruktor
- 25. C++ pusty konstruktor String
- 26. Struct C# Generic Konstruktor
- 27. Wywołanie przesłonięta Konstruktor i podstawa Konstruktor w C#
- 28. Delegat Konstruktor C++
- 29. Safehandle w języku C#
- 30. Jak i kiedy są usuwane elementy statyczne C#?
Dzięki, że ma to sens, kiedy myślę o tym poprawnie! – Jason
Ciekawe, że mówi "przed utworzeniem pierwszej instancji lub z jakimikolwiek statycznymi elementami członkowskimi". Istnieje pewna swoboda w *, gdy * faktycznie zostanie wywołana. –
@TimBarrass ze względu na inne wymagania specyfikacji okazuje się, że "przed" jest faktycznie "bezpośrednio przed" - zobacz artykuł Jona Skeeta wymieniony w innej odpowiedzi - http://stackoverflow.com/a/1437372/477420 –