Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211

Применение статического конструктора

14.12.2019, 11:41. Показов 2937. Ответов 9

Студворк — интернет-сервис помощи студентам
Отрывок от класса Math
C#
1
2
3
4
5
public static class Math
{
    public const double PI = 3.14159265358979323846;
    public const double E = 2.7182818284590452354;
}
Отрывок из класса Console
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static class Console
{
    public static int CursorLeft
    {
        [System.Security.SecuritySafeCritical]  // auto-generated
        [ResourceExposure(ResourceScope.None)]
        [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)]
        get
        {
            Win32Native.CONSOLE_SCREEN_BUFFER_INFO csbi = GetBufferInfo();
            return csbi.dwCursorPosition.X;
        }
        [ResourceExposure(ResourceScope.Process)]
        [ResourceConsumption(ResourceScope.Process)]
        set
        {
            SetCursorPosition(value, CursorTop);
        }
    }
}
Как ни посмотрю - статические конструкторы не используются, и данные инициализируется в той же строке, где создаются, либо через свойства.
Вопросы:
1) Существуют ли такие моменты, при которых без статических конструкторов просто никак не обойтись?
2) Являются ли данные конструкторы хорошим стилем программирования?
3) В каких моментах вы бы использовали данные конструкторы?
4) Можете добавить что то от себя.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2019, 11:41
Ответы с готовыми решениями:

Ошибка при вызове статического конструктора статического класса
Здравствуйте! Проблема в следующем: Есть класс public static class 1 { static Point arr; public static...

Применение статического метода выдает ошибку компиляции
Здравствуйте. Есть примерно такая система: public abstract class StoreItem { public int Oid { get; set; } } public class...

Графический режим. Применение графических функций. Методы реализации статического и динамического изображения
помогите очень надо ищю такжы програмиста за деньги задача a) (Задача № 1 и № 2) Используя функции графической библиотеки реализовать...

9
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.12.2019, 11:52
Лучший ответ Сообщение было отмечено Enifan как решение

Решение

Цитата Сообщение от Enifan Посмотреть сообщение
Существуют ли такие моменты, при которых без статических конструкторов просто никак не обойтись?
Да.
Например, если для инициализации типа нужно произвести некоторые действия, которые не связаны с инициализацией статических полей.

Цитата Сообщение от Enifan Посмотреть сообщение
Являются ли данные конструкторы хорошим стилем программирования?
Если действия нужны для инициализации типа, то да.
Если просто веселья ради, то нет.

Цитата Сообщение от Enifan Посмотреть сообщение
В каких моментах вы бы использовали данные конструкторы?
В моментах, когда некий тип не может быть использован без какой-то инициализации, не связанной с инициализацией статических полей этого типа.
Или связанной с инициализацией всех полей сразу, а не по отдельности.
Не самый удачный пример — инициализация статических полей из файла конфигурации.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
14.12.2019, 12:11
Цитата Сообщение от kolorotur Посмотреть сообщение
Если просто веселья ради, то нет.
Есть еще один момент, связанный с реализацией паттерна Singletone. Позволяет использовать потокобезопасную (но не lazy) реализацию паттерна без использования конструкции синхронизации. У Скита описано.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public sealed class Singleton
    {
    private static readonly Singleton instance = new Singleton();
 
    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }
 
    private Singleton()
    {
    }
 
    public static Singleton Instance => instance;
    
    }
2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.12.2019, 12:36
IamRain, я не большой фанат использования языковых конструкций с единственной целью "обмануть" рантайм, хотя и им есть свое место.
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
14.12.2019, 13:40
Микрософт в свою очередь приводит всего несколько классических
примеров использования.

Я всегда осторожно отношусь к наличию static в любом месте кода.

Статические объекты - помним, что они попадают в high frequency heap и живут там до конца жизни приложения (GC не работает с этой частью кучи). Помним так же, что в случае разрешения на запись, несколько потоков могут по очереди поменять значение и к моменту чтения поток может оперировать не корректным значением.

Статические конструкторы - опасность возникновения исключений (у Скита кстати в примере по ссылке выше, этот момент указан).

Статические методы - предполагают единственную реализацию, т.к., что логично, не могут быть частью интерфейса.

Статические классы экстеншены - всегда должны быть очень простыми, без внешних зависимостей и с минимумом логикой.

Тем не менее, static - это такой же элемент языка, как и другие, и отказываться от него не стоит, просто нужно понимать, почему именно он вам нужен.
1
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
14.12.2019, 14:36  [ТС]
Цитата Сообщение от Ourn Посмотреть сообщение
static - это такой же элемент языка, как и другие, и отказываться от него не стоит
суть статик классов, методов, данных мне известна, и там где надо ими пользоваться - я пользуюсь. Только конструктор вызывает вопросы.
Просто пока что корректного примера я не встречал на своей практике, от того и не ясно где применять "правильно" данный конструктор. Вся надежда на время.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.12.2019, 00:41
Цитата Сообщение от Enifan Посмотреть сообщение
пока что корректного примера я не встречал на своей практике
А какой пример вы бы посчитали корректным?
Вот, например, использование статического конструктора при инициализации SSL в .NET Core: https://github.com/dotnet/core... ization.cs
1
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
15.12.2019, 12:56  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
А какой пример вы бы посчитали корректным?
как я понял, если просто задавать значение, то смысла нет
C#
1
static int PI = 3.14
а если нужно вызвать метод, то конструктор единственный кто сможет это реализовать. Нашел к себя давний код, переделал его под статик, и понял что вызвать метод connect.Open() может только статик конструктор
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static class Sql
{
    // Данные для SQL
    static SqlConnection connect;
    static SqlCommand command;
    static SqlDataReader reader;
 
    static Sql()
    {
        // Подключение к SQL
        connect = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\DataBase\Database.mdf;Integrated Security=True");
        connect.Open();
 
        // Класс для запросов к SQL
        command = new SqlCommand();
        command.Connection = connect;
    }
}
Вроде стало понятно
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
15.12.2019, 14:17
Enifan, по-моему, это не совсем корректный пример использования static конструктора, потому что может быть много моментов, когда вы получите TypeLoadException:
1. Некорректная строка подключения
2. Сервис СУБД не запущен
3. Некорректные логин/пароль.

Получается, рантайм не сможет инициализировать тип просто из за проблем с доступом к базе. Я бы использовал инициализацию в статик конструкторе только когда есть твердая уверенность, что этот код не будет вызывать ошибок.
А работу с БД надо выносить в другие методы.
2
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
15.12.2019, 14:45  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
А работу с БД надо выносить в другие методы
ну я для работы с БД сделал отдельный класс, где и будут все запросы.
Цитата Сообщение от IamRain Посмотреть сообщение
много моментов, когда вы получите TypeLoadException:
1. Некорректная строка подключения
2. Сервис СУБД не запущен
3. Некорректные логин/пароль.
по хорошему счет да, насколько мне известно - оборачивают в блок try-catch, но по логике если подключение к БД отсутствует - то нет смысла запускать программу вообще, так как без БД в ней делать нечего.
Цитата Сообщение от IamRain Посмотреть сообщение
не совсем корректный пример использования static конструктора
учту на будещее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2019, 14:45
Помогаю со студенческими работами здесь

Применение конструктора- пример из книги.Что за чудиса?
Вместо того что в конструктооре инициализировать переменные в скобках- одной переменной присваиваем значение другой, приминяя присвоитель =...

Почему при вызове конструктора из конструктора нельзя передавать this как аргумент?
Есть такой код: public class Order { { } Order(){ this(this.hashCode());//ошибка тут } ...

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и какой плюс от использования перемещающего...

Вызов конструктора из конструктора и проверка правильности передаваемых параметров
Существует такой код: public Matrix(Double array) : this(array.GetLength(0), array.GetLength(1)) { ...

Инициализация конструктора и конструктора родительского класса
Есть два класса: class C1 { public $a; public $b; public $c; function __construct($a,$b,$c) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru