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

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

14.12.2019, 11:41. Показов 2920. Ответов 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,228
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,228
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru