Jaki jest pożytek z konstruktorów statycznych?

Proszę mi wyjaśnić użycie konstruktora statycznego. Dlaczego i kiedy mielibyśmy stworzyć statyczny konstruktor i czy można go przeciążyć?

Author: yoozer8, 2010-12-22

9 answers

No nie można go przeciążać; statyczny konstruktor jest przydatny do inicjalizacji dowolnych statycznych pól powiązanych z typem ( lub innych operacji dla każdego typu) - przydatny w szczególności do odczytu wymaganych danych konfiguracyjnych do pól readonly, itp.

Jest uruchamiany automatycznie przez runtime za pierwszym razem, kiedy jest potrzebny (dokładne reguły są skomplikowane (patrz "beforefieldinit") i zmieniane subtelnie pomiędzy CLR2 i CLR4). O ile nie nadużywasz refleksji, to gwarantujemy, że biegniesz w większość raz (nawet jeśli dwa wątki pojawiają się w tym samym czasie).

 208
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-22 07:22:38

From Static Constructors (C# Programming Guide):

Statyczny konstruktor służy do inicjalizacji dowolnych danych statycznych, lub do wykonać określone działanie, które wymaga wykonywane tylko raz. Nazywa się automatycznie przed pierwszym instancja jest tworzona lub dowolna statyczna członkowie są odwołani.

Konstruktory statyczne mają następujące właściwości:

  • Statyczny konstruktor nie przyjmuje modyfikatorów dostępu ani nie ma parametry.

  • Statyczny konstruktor jest wywoływany automatycznie w celu zainicjowania klasy przed utworzeniem pierwszej instancji lub odwołaniem się do statycznych członków.

  • Konstruktor statyczny nie może być wywołany bezpośrednio.

  • Użytkownik nie ma kontroli nad wykonaniem statycznego konstruktora w programie.

  • Typowe użycie konstruktorów statycznych jest wtedy, gdy Klasa używa pliku dziennika i konstruktor jest używany do zapisu wpisy do tego pliku.

  • Konstruktory statyczne są również przydatne podczas tworzenia klas wrapper dla kodu niezarządzanego, gdy konstruktor może wywołać metodę LoadLibrary.

 99
Author: Adriaan Stander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 13:19:27

Konstruktory statyczne są również bardzo przydatne, gdy masz statyczne pola, które opierają się na sobie tak, że kolejność inicjalizacji jest ważna. Jeśli uruchomisz swój kod za pomocą programu formatującego / upiększającego, który zmienia kolejność pól, możesz znaleźć wartości null tam, gdzie ich nie spodziewałeś.

Przykład: załóżmy, że mamy tę klasę:

class ScopeMonitor
{
    static string urlFragment = "foo/bar";
    static string firstPart= "http://www.example.com/";
    static string fullUrl= firstPart + urlFragment;
}

Kiedy uzyskasz dostęp fullUr, będzie to " http://www.example.com/foo/bar".

Miesiące później jesteś czyszczenie kodu i alfabetyzacja pól (Załóżmy, że są one częścią znacznie większej listy, więc nie zauważysz problemu). Masz:

class ScopeMonitor
{
    static string firstPart= "http://www.example.com/";
    static string fullUrl= firstPart + urlFragment;
    static string urlFragment = "foo/bar";
}

Twoja fullUrl wartość jest teraz tylko " http://www.example.com / " ponieważ urlFragment nie była inicjalizowana w czasie ustawiania fullUrl. Niedobrze. Więc dodajesz statyczny konstruktor, który zajmie się inicjalizacją:

class ScopeMonitor
{
    static string firstPart= "http://www.example.com/";
    static string fullUrl;
    static string urlFragment = "foo/bar";

    static ScopeMonitor()
    {
        fullUrl= firstPart + urlFragment;

    }
}

Teraz, bez względu na kolejność pól, inicjalizacja zawsze będzie poprawna.

 82
Author: Mark Meuer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 17:12:47

1.It może uzyskać dostęp tylko do statycznych członków klasy.

Powód: element Niestatyczny jest specyficzny dla instancji obiektu. Jeśli statyczny konstruktor może pracować na statycznych prętach, będzie to odzwierciedlać zmiany we wszystkich instancjach obiektu, co jest niepraktyczne.

2.W statycznym konstruktorze nie powinno być żadnych parametrów.

Powód: ponieważ zostanie wywołany przez CLR, nikt nie może przekazać parametru do niego. 3.Tylko jeden konstruktor statyczny jest dozwolone.

Powód: przeciążenie wymaga, aby obie metody różniły się pod względem definicji metody/konstruktora, co nie jest możliwe w konstruktorze statycznym.

4.Nie powinno być do niego modyfikatora dostępu.

Powód: ponownie powodem jest to samo wywołanie statycznego konstruktora wykonywane przez CLR, a nie przez obiekt, bez potrzeby posiadania modyfikatora dostępu do niego

 10
Author: ravithejag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 13:23:12

Możesz użyć statycznego konstruktora do inicjalizacji pól statycznych. Działa w nieokreślonym czasie, zanim pola te zostaną użyte. Dokumentacja Microsoftu i wielu programistów ostrzega, że statyczne konstruktory na danym typie nakładają znaczne obciążenie.
najlepiej unikać statycznych konstruktorów dla maksymalnej wydajności.
update: nie możesz używać więcej niż jednego statycznego konstruktora w tej samej klasie, ale możesz używać innych konstruktorów instancji z (maksymalnie) jednym statycznym konstruktor.

 7
Author: dotfreelancer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 12:43:08

Dlaczego i kiedy mielibyśmy stworzyć statyczny konstruktor ...?

Jednym specyficznym powodem użycia statycznego konstruktora jest utworzenie klasy 'super enum'. Oto (prosty, wymyślony) przykład:

public class Animals
{
    private readonly string _description;
    private readonly string _speciesBinomialName;

    public string Description { get { return _description; } }
    public string SpeciesBinomialName { get { return _speciesBinomialName; } }

    private Animals(string description, string speciesBinomialName)
    {
        _description = description;
        _speciesBinomialName = speciesBinomialName;
    }

    private static readonly Animals _dog;
    private static readonly Animals _cat;
    private static readonly Animals _boaConstrictor;

    public static Animals Dog { get { return _dog; } }
    public static Animals Cat { get { return _cat; } }
    public static Animals BoaConstrictor { get { return _boaConstrictor; } }

    static Animals()
    {
        _dog = new Animals("Man's best friend", "Canis familiaris");
        _cat = new Animals("Small, typically furry, killer", "Felis catus");
        _boaConstrictor = new Animals("Large, heavy-bodied snake", "Boa constrictor");
    }
}

Użyłbyś go bardzo podobnie (w wyglądzie składniowym) do każdego innego enum:

Animals.Dog

Zaletą tego w stosunku do zwykłego enum jest to, że można łatwo hermetyzować powiązane informacje. Wadą jest to, że nie można użyć tych wartości w instrukcji switch (ponieważ wymaga wartości stałych).

 4
Author: Kenny Evitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 21:05:05

Konstruktor Statyczny

Konstruktor zadeklarowany przy użyciu modyfikatora statycznego jest konstruktorem statycznym. Konstruktor statyczny jest używany do inicjalizacji danych statycznych lub do wykonania określonej akcji, która musi być wykonana tylko raz w cyklu życia klasy. Statyczny konstruktor jest pierwszym blokiem kodu do wykonania w klasie. Konstruktor statyczny wykonuje tylko jeden raz w cyklu życia klasy. Jest wywoływany automatycznie. Konstruktor statyczny nie przyjmuje żadnych parametrów. Nie ma dostępu / align = "left" / Nie jest wywoływany bezpośrednio.

 2
Author: Hasan Fathi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 06:40:35

Konstruktor statyczny jest używany do inicjalizacji statycznych elementów danych tak szybko, jak to możliwe jako, że klasa jest odwołana po raz pierwszy, podczas gdy konstruktor instancji jest używany do utworzenia instancji tej klasy ze słowem kluczowym.

Źródło: http://www.c-sharpcorner.com/article/static-constructor-in-C-Sharp-and-their-usages/

 -1
Author: JedatKinports,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 07:18:39

using System;
namespace Constructor
{
class Test
{
//Declaration and initialization of static data member 
private static int id = 5;
public static int Id
{
get
{
return id;
}
}
public static void print()
{
Console.WriteLine("Test.id = " + id);
}
static void Main(string[] args)
{
//Print the value of id 
Test.print();
}
}
}

In the above example, static data member <id> is declared and initialized in same line. So if you compile and run this program your output would look similar to this :

Test.id = 5

Lets create one more class similar to class Test but this time the value of its static data member would depend on the value of static data member <id> of class Test.id.

//File Name : Test1.cs
using System;
namespace Constructor
{
class Test1
{
private static int id ;
//Static constructor, value of data member id is set conditionally here. 
//This type of initialization is not possible at the time of declaration.
static Test1()
{
if( Test.Id < 10 )
{
id = 20;
}
else
{
id = 100; 
}
Console.WriteLine("Static<Class> Constructor for Class Test1 Called..");
}
public static void print()
{
Console.WriteLine("Test1.id = " + id);
}
static void Main(string[] args)
{
//Print the value of id 
Test1.print();
}
}
}

As you can see in the above static constructor, static data member <id> is initialized conditionally. This type of initialization is not possible at the time of declaration. This is where static constructor comes in picture
 -2
Author: LDS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 14:12:46