Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49

Организация событий между классами

04.01.2017, 12:23. Показов 6936. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс записи в файл, писать необходимо из экземпляров _a, _b, но из этих экземпляров нет доступа к
экземпляру log3, приходиться создавать в каждом классе свои экземпляры log1 и log2 - что не есть правильно
мне так кажется, как правильно все таки сделать посоветуйте пожалуйста?
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
34
35
36
37
38
39
40
41
42
43
 public delegate void LOGHandler(TypeLog a, string mes);
class A
{  
   event LOGHandler LogEvent;
        public void SaveLOG(TypeLog type, string mes)
        {
                if (LogEvent == null)
                {
                LOGING log1 = new LOGING();
                    LogEvent += new LOGHandler(log1.LOGevent);
                }
                LogEvent(type, mes);
        }
}
 
class B
{
event LOGHandler LogEvent;
        public void SaveLOG(TypeLog type, string mes)
        {
                if (LogEvent == null)
                {
                LOGING log2 = new LOGING();
                    LogEvent += new LOGHandler(log2.LOGevent);
                }
                LogEvent(type, mes);
        }
 
}
 
class MAIN
{
  A _a;  B _b;   
  LOGING log3 = new LOGING();
}
 
class LOGING
{
  public void LOGevent(TypeLog type, string mes)
  {
  //код записи в файл
  }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2017, 12:23
Ответы с готовыми решениями:

Отношения между классами
Ребята, всем привет!!! Мне очень нужна ваша помощь!!! Необходимо разработать класс Car. Добавить в класс 3 поля: марка автомобиля, цвет...

Связи между классами
Всем привет:) Друзья подскажите пожалуйста если Я передаю обьект в метод, какая это связь? public void Method(MyClass my) // какая...

Передача между классами
Имеются 2 класса Kisti.cs и Form1.cs Вот содержимое Kisti.cs: class Kisti { public static Pen Black = new...

41
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.01.2017, 14:16
Цитата Сообщение от dav1977 Посмотреть сообщение
как правильно все таки сделать
Сделайте класс для логгирования статическим, например.
1
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
04.01.2017, 15:45
Цитата Сообщение от insite2012 Посмотреть сообщение
как правильно все таки сделать
Еще очень хороший вариант - использовать уже готовое решение для логированя, к примеру NLog
1
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
04.01.2017, 21:51  [ТС]
Вопрос не связан с логированнием, класс логирования - взят для примера.
Класс LOG не статический.
Вопрос именно по событиям и их организации.
Все таки можно обойтись без статического класса?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
04.01.2017, 22:22
dav1977, обьясните подробнее задачу, тогда найдем оптимальный вариант. Если вам нужен определенный общий код - тогда да, лучше вынести в статический касс, так удобнее, можно еще использовать паттерн синглтон.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class A
{
    public void Foo()
    {
        SomeStaticClass.Foo();
    }
}
 
public class B
{
    public void Foo()
    {
        SomeStaticClass.Foo();
    }
}
 
public static class SomeStaticClass
{
    public static void Foo()
    {
        //some functional code
    }
}
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
04.01.2017, 22:59  [ТС]
задача научиться использовать события(event), для передачи данных между не статическими классами.
ведь для этого события и предназначены, что бы не было статических классов для общих данных( принципы ООП.) (так называемых классов "помоек" где собранны все данные из разных классов)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.01.2017, 23:17
Цитата Сообщение от dav1977 Посмотреть сообщение
задача научиться использовать события(event), для передачи данных между не статическими классами.
dav1977, понимаете в чем дело, вы бросаетесь в крайности. Есть разные задачи, и разные способы их решения.
К примеру, нужен какой-либо служебный метод, для выполнения задачи. А поскольку методы в C# без классов существовать не могут, он выносится в отдельный (статический) класс. Сам класс нам не важен, и нам не нужно создавать из него объекты - нам нужен просто метод. Вот тут и нужны статические классы/методы.
С другой стороны, у нас есть тип, и каждый из созданных из него объектов может обладать определенным состоянием (отличным от других того же типа). Тут нужны, естественно, обычные классы, с возможностью создания объектов.
Наглядный пример - служебный класс System.Math. Нам не нужные его объекты, нужен просто функционал.
И в отличие от него, возьмем такой класс как FileInfo, например. Они все одного типа, но каждый хранит информацию о разных файлах (у всех разное состояние), поэтому смысла делать его статическим нет.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
04.01.2017, 23:26  [ТС]
не понимаю почему крайности? в С# есть event события если знаете как ими пользоваться, так ответьте пожалуйста, пример который я привел с логированием не имеет смысла делать через event.т.к проще сделать через статический класс,
но лучше сделать без статического класса, вот я и спрашиваю это МОЖНО сделать лучше чем я сделал или вы не можете придумать лучшее решение через event! ?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
04.01.2017, 23:40
dav1977, вот пример использования событий

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
public class HostClass
{
    public delegate void MyDelegate(int someValue);
    public event MyDelegate OnSomthingChanged;
 
    public void ChangeSomething()
    {
        var a = 123;
        OnSomthingChanged?.Invoke(a);
    }
}
 
public class UserClass
{
    public UserClass()
    {
         var hostClassObject = new HostClass();
         hostClassObject.OnSomthingChanged += OnEventFired;
    }
 
    public void OnEventFired(int someValue)
    {
         var a = someValue; //123;
     }
}
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
04.01.2017, 23:53  [ТС]
спасибо вот это ближе к теме.. вызов события OnSomthingChanged?.Invoke(a); а зачем Invoke и вопрос- это опечатка?
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
04.01.2017, 23:57
dav1977, Invoke непосредственно вызывает функцию

конструкция
C#
1
OnSomthingChanged?.Invoke(a);
эквивалентна

C#
1
2
if(OnSomthingChanged != null)
    OnSomthingChanged(1);
Тоесть перед вызовом идет проверка на то что есть ли хоть один "слушатель" евента

Знак вопроса - это оператор языка
2
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 11:19  [ТС]
Проанализировал, не совсем подходит ваша конструкция.
UserClass - основной класс(аналог моего LOGGING) создает экземпляр HostClass

а если HostClass будет много HostClass1 HostClass2 и т.д.
можно сделать так что бы UserClass не создавал экземпляры?
а подписаться на событие из HostClass1 HostClass2 и т.д. экземпляры которых
создаст другой класс MAIN например

UserClass должен быть в единственном экземпляре(он пишет файл)
а множество других должны вызывать метод в UserClass(типа save_to_file)
ЧЕРЕЗ event!

Добавлено через 2 часа 38 минут
Наверно задача не выполнимая в рамках C# - event не может быть видимым всеми классами одновременно.

Как же тогда передавать данные между закрытыми классами? остается делать статический класс "помойку"
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.01.2017, 12:41
dav1977, любая задача выполнима, если ее правильно сформулировать.

C# так же поддерживает статические евенты

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyClass
    {
        public static event EventHandler MyEvent;
 
        public void RaiseEvent()
        {
            MyEvent?.Invoke(this, EventArgs.Empty);
        } 
    }
 
.....
......
MyClass.MyEvent += (sender, args) => { Debug.WriteLine("RISED"); };
 
var object1 = new MyClass();
var object2 = new MyClass();
 
object1.RaiseEvent();
object2.RaiseEvent();
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 15:07  [ТС]
Спасибо то что надо, не знал про это
переписал более понятно
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
 public class LOGGING
    {
        public static event EventHandler LOGEvent;
        public void podpis()
        {
            LOGGING.LOGEvent += (sender, args) => { Console.WriteLine("Logging"); };
        }     
        public void savelog()
        {
            LOGEvent?.Invoke(this, EventArgs.Empty);
        }
    }
 
    public class MAIN
    {
        LOGGING log;
        void init_log()
        {
            log.podpis();
        }
       void  work()
        {
            log.savelog();//печать лога
 
        }
 
    }
Добавлено через 11 минут
неправильно переписал, вот так только event опять не доступен
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
34
    public delegate void LOGHandler(TypeLog a, string mes);
 
    public class LOGGING
    {
        public static event EventHandler LOGEvent;
        public void podpis()
        {
            LOGGING.LOGEvent += (sender, args) => { Console.WriteLine("Logging"); };
        }     
        public void savelog()
        {
            LOGEvent?.Invoke(this, EventArgs.Empty);
        }
    }
 
    public class MAIN
    {
        LOGGING log;
        void init_log()
        {
            log.podpis();
        }
      
    }
 
 
    public class work
    {
        void Save(TypeLog type, string mes)
        {
            LOGGING.LogEvent(type, mes);
        }
 
    }
Добавлено через 15 минут
C#
1
public static event EventHandler MyEvent;
все равно закрытый и невидимый для других классов
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.01.2017, 15:58
dav1977, вам стоит для начала изучить язык, а затем делать определенные выводы. Евенты предназначены для того чтобы оповещать ДРУГИЕ обьекты об их вызове. Вы не можете на прямую вызывать евен из другой области видимости, только подписаться на событие.

но вы вполне можете написать статическую функцию для вызова статического евента

C#
1
2
3
4
5
6
7
8
public static void RiseEvent(object sender)
        {
            MyEvent?.Invoke(sender, EventArgs.Empty);
        }
 
.....
 
MyClass.RiseEvent(something); //rise from everywhere
Но сами просто подумайте о том какой жуткий кастыль у вас получился. Вы создаете евент, подпысываетесь на него в екземляре этого класса, который собираетесь отутуда же вызывать?. Прям какето масло масляное, это синтаксический мусор.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 18:07  [ТС]
Все правильно я пытаюсь изучить event, получается каша в голове.

Зачем они нужны не понятно. Всегда можно вызвать метод, а не event.

Они нужны для внешних библиотек, где не известен подписчик,
а в одном проекте делать event получается не имеет смысла.

пример с логированием, без статического класса не сделать.
Задача все таки не выполнимая?

Добавлено через 1 час 53 минуты
Сформулирую итог:
принцип events: один объект -> ко многим, а у задачи логгирования
другой принцип: множество объектов -> к одному
поэтому эту задачу не решить с помощью events.

Как решить задачу передачи данных из множества классов в один не статический класс?
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
05.01.2017, 18:16
Паттерн Singleton разве не решает проблему возможности обратиться к классу из любой точки программы?
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 18:19  [ТС]
наверно надо через очередь

Добавлено через 2 минуты
Singleton это ведь статический класс?
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
05.01.2017, 18:29
Singleton - это не статический класс.
Singleton - гарантирует, что будет создан один экземпляр этого класса и то, только при первом вызове Instance.Последующие обращение будут ссылаться на один и тот же экземпляр.Вот потокобезопасный( Lazy ) шаблон для паттерна Singleton:

C#
1
2
3
4
5
6
7
8
9
10
11
public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());
    
    public static Singleton Instance { get { return lazy.Value; } }
 
    private Singleton()
    {
    }
}
Добавлено через 1 минуту
Singleton не предоставляет никаких других способов получения экземпляра, кроме статического свойства - а свойство написано так, что двух разных экземпляров никогда не отдаст
1
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 19:00  [ТС]
Singleton получается возвращает только свойство, а как передать данные в Singleton и чтобы он их записал в файл, это возможно сделать?

Добавлено через 22 минуты
условно все равно он статический, что не есть хорошо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2017, 19:00
Помогаю со студенческими работами здесь

Random между классами
Пожалуйста, можете накинуть идею, как реализовать данную задачу. Существует 6 классов, которые наследуются от 1 класса. И мне нужно сделать...

Обмен данными между классами
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Передача данных между классами
Как перевести a.ToString() или же fff из public void getdata в void Fillcombo() для последующей обработки? public void...

Передача строк между классами
Здравствуйте. Возникла проблема в формировании логов. Имеется приложение, с кучей форм, классов. Необходимо при возникновении в каждом...

Ссылка на обьект между классами
Есть два класса class CLASS1 { MySqlConnection myConnection = new MySqlConnection(Connect); } class Class2 {


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru