Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778

Singletone для Class library

29.10.2019, 16:42. Показов 4628. Ответов 98
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
приветствую всех,

Каждый раз в каждом class где я работаю с class library я создаю объект.
Говорят это не есть хорошо.

Например:
C#
1
2
3
4
5
6
7
8
9
10
Public class Wehicle
{
   public Wehicle()
 
             {
                    WehicleFrame = new Frame();
             }
 
              //далее пользуюсь различными методами класса Frame
}
таким же образом пользуюсь в другом классе

C#
1
2
3
4
5
6
7
8
9
10
Public class Ship
{
   public Ship()
 
             {
                    ShipFrame = new Frame();
             }
 
              //далее пользуюсь различными методами класса Frame
}
говорят это плохо, нужно сделать singleton.

Вопрос, как сделать singleton из класса Frame?

спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2019, 16:42
Ответы с готовыми решениями:

Intellisense и autocompletion в библиотеках класса (Class Library)
Глупый вопрос. Поэтому задаю здесь, хотя не совсем уж и начинающий. Создал проект из шаблона Class Library (что бы сборочку dll получить)...

Работа с DirectX: Output Type of Class Library
Доброго времени суток. Я новичок в DirectX и C#. Скачал SharpDX с примерами. Эти примеры не запускаются. Выдаёт следующее сообщение: A...

Как узнать путь к ресурсу сборки Class Library?
Здравствуйте, я разрабатываю addin для Excel. В проект addin`а я добавил ресурс: шаблон Excel. Хочу открыть его средствами...

98
 Аватар для Enifan
1846 / 1188 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
29.10.2019, 16:54
Bulky,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    class Frame
    {
        private static Frame instance;
 
        private Frame() { }
 
        public static Frame getInstance()
        {
            if (instance == null)
                instance = new Frame();
            return instance;
        }
    }
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
29.10.2019, 16:55  [ТС]
А как потом обращаться к этому singleton Frame из другого класса или других классов?
Можно пример?
0
 Аватар для Enifan
1846 / 1188 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
29.10.2019, 17:05
Bulky,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Frame.getInstance().PrintMessage();
 
            Console.ReadKey();
        }
    }
 
    class Frame
    {
        private static Frame instance;
 
        private Frame() { }
 
        public static Frame getInstance()
        {
            if (instance == null)
                instance = new Frame();
            return instance;
        }
 
        public void PrintMessage()
        {
            Console.WriteLine("Hello");
        }
    }
}
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
29.10.2019, 17:14  [ТС]
Enifan,

Не эксперементировал, правда, что если наделаешь кучу таких вот экземпляров (если нет singleton) , программа уйдет в неадекват. Или что-то подобное?
0
 Аватар для Enifan
1846 / 1188 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
29.10.2019, 17:32
Bulky, Тут зависит от логики класса.
Если есть например класс Машина, то при создании объектов - вы просто "создаете" машины (ауди, бмв, камаз)
Другое дело, использовать класс только в одном экземпляре, пару банальных примеров с ходу
1) Любая компьютерная игра. При синглтоне вы не сможете запустить ее дважды. Это может помочь избежать некоторые ошибки, а также "жульничать" играя в 2-3 окна.
2) Панель управления реальным самолетом, есть 2 пилота. Если создать 2 объекта такого класса, то один пилот может повернуть налево, другой направо, и это будет делаться одновременно. Сбой программы. Но если класс синглтон-одиночка, и он будет продуман хороший алгоритм для управления 2-ум пилотам одновременно, то сбоев не будет (например приоритет управления будет у пилота №1)
Примеры может и не айс, но хоть что то.
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
29.10.2019, 17:32  [ТС]
ОК. спасибо!
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
30.10.2019, 08:39  [ТС]
Enifan, Вроде все просто, но я что-то упускаю.
концы с концами не сходятся. Потому-что на class library Frame у меня reference и мне его не нужно создавать.
Я не могу писать этот rод в классе Frame, т.к. он по сути есть library.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    class Frame
    {
        private static Frame instance;
 
        private Frame() { }
 
        public static Frame getInstance()
        {
            if (instance == null)
                instance = new Frame();
            return instance;
        }
    }

Вот в данном случае как с него singleton сделать?
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
30.10.2019, 10:20
Bulky, не совсем понял, о чем вы. но он у вас и так синглтон. Чтобы его использовать в других сборках сделайте класс публичным.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
30.10.2019, 10:23  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
Bulky, не совсем понял, о чем вы. но он у вас и так синглтон. Чтобы его использовать в других сборках сделайте класс публичным.
Я к тому, что имея доступ к классу Frame мы внутри самого Frame пишем.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 class Frame
    {
        private static Frame instance;
 
        private Frame() { }
 
        public static Frame getInstance()
        {
            if (instance == null)
                instance = new Frame();
            return instance;
        }
 
        public void PrintMessage()
        {
            Console.WriteLine("Hello");
        }
    }
А если я не имею к нему доступа? Я не могу залезть в него и сделать в нем самом Singleton.
Он как class library в проекте, добавлен через Add --> reference?
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
30.10.2019, 10:45
Bulky, никак. Если вы не можете менять класс, то вы его не измените
Можете сделать такое
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    class FrameInstance
    {
        private static Frame instance;
 
        private FrameInstance() { }
 
        public static Frame Instance
        get
        {       
            {
                if (instance == null)
                    instance = new Frame();
                return instance;
            }
        }
        
        public void PrintMessage()
        {
            Console.WriteLine("Hello");
        }
    }

, класс будет хранить экземпляр, который смогут использовать остальные. Но это не синглтон, объект фрейма можно будет создавать, соответственно можно сильно испортить себе жизнь, если какой-то класс создаст свой экземпляр фрейма и будет использовать его вместо нужного.
Вообще тут больше напрашивается Dependecy Injection нежели синглтон.
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
30.10.2019, 10:54  [ТС]
Lexeq,

это уже какие-то дебри.

Мы наверное немного о разных вещах. Может сначала?

Есть class Frame, я пользуюсь его методами. Это класс из library. Мне сказали, что ты открываешь много объектов этого класса Frame в разных местах (классах) проекта. Сделай singleton, чтобы не плодить столько объектов.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
30.10.2019, 10:57
Bulky, есть доступ к исходникам library?
0
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
30.10.2019, 11:01  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
Bulky, есть доступ к исходникам library?
В данный момент момент library, подключена как .nupkg.

Вы имеете ввиду подключить library (source) как project с референсированием, и затем лезть в library и делать там singleton.
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
30.10.2019, 11:07
Bulky, если вы можете менять код library, то делайте синглтон. Если код library менять нельзя, то синглтон вы не сделаете. Единственное, что можно тогда сделать это где-то хранить экземпляр Frame и испоьзовать его.
0
 Аватар для Enifan
1846 / 1188 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
30.10.2019, 13:18
Bulky,
1) Можно с помощью рефлексии переделать недоступный класс, но эта тема не для новичков.
2) Либо создать один объект класса Frame, и через ссылки (которые находятся в разных местах кода) работать с ним.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
30.10.2019, 14:25
Ещё бы кто-нибудь обратил внимание, что сделав синглтон у машины и лодки будет одна и та же рама. И глухой телефон донес до форума не оригинальную формулировку задачи
1
-21 / 29 / 2
Регистрация: 17.03.2018
Сообщений: 778
30.10.2019, 14:30  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
Ещё бы кто-нибудь обратил внимание, что сделав синглтон у машины и лодки будет одна и та же рама. И глухой телефон донес до форума не оригинальную формулировку задачи
Могу поменять на poo и foo. Устроит?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,074
Записей в блоге: 2
30.10.2019, 14:33
Bulky, конкретно в этом описанном вами примере, как уже сказал КОП, синглтон Frame не к чему.
Он ника не вяжется с задачей.

Возможно вы неверно упростили реальную задачу, поэтому вас никак не поймут.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
30.10.2019, 14:34
Bulky, это уберёт некорректный и ненужный контекст.
Решение кстати давно дано в 11 посте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2019, 14:34
Помогаю со студенческими работами здесь

Как искусственно вызвать exception в Class Library (пока пустой)
Привет! Нужно протестировать обработку Exception в project Class Library. Проект пока пустой. Как в нем исcкуственно вызвать Exception? ...

Вопрос из теста: A project with an Output Type of Class Library cannot be started directly
Вы проверяете код, написанный вашим коллегой. При компиляции Windows-приложения появляется следующее сообщение: A project with an Output...

Есть Class library (с работающим кодом) как найти то, что запускает этот код?
Привет! Есть Class library ( с работающим кодом) как найти то, что запускает этот код? public classB { int i = 30;

Можно ли в class library "запихать" интерфейс?
вопрос в шапке. ну в плане "не рекомендуется" и т.п

Нужно составить регулярное выражение для поиска <div class="market_row_name"> и <div class="market_row_price">
Заранее спасибо!


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru