none
Вопрос по созданию объектов RRS feed

  • Вопрос

  • Набросал код, по сути это моя первая программа. В связи с этим вопрос, правильно ли я делаю когда создаю два раза объект evt? Или нужно было создать объект в Main? Или вообще как-то сделать по другому?
    using System;
    using System.IO;
    using System.Diagnostics;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
        class Program
        {
    
            static void Main(string[] args)
            {
               FileSystemWatcher watch = new FileSystemWatcher();
                watch.Path = @"C:\testapp\";
                watch.EnableRaisingEvents = true;
                watch.Created += new FileSystemEventHandler(watch_Created);
                watch.Deleted += new FileSystemEventHandler(watch_Deleted);
                Console.ReadLine();
            }
    
            static void watch_Deleted(object sender, FileSystemEventArgs e)
            {
                EventLog evt = new EventLog("Application");
                evt.Source = "Deleting Watcher";
                evt.WriteEntry("Удален файл" + e.FullPath);
            }
            static void watch_Created(object sender, FileSystemEventArgs e)
            {
                EventLog evt = new EventLog("Application");
                evt.Source = "Creating Watcher";
                evt.WriteEntry("Создан файл" + e.FullPath);
            }
        }

    19 октября 2014 г. 12:15

Ответы

  • Все зависит от частоты использования объекта evt. С одной стороны если он будет использоваться часто, то оптимально создать его глобально, так как это сэкономит тысячные доли секунды на его постоянное создание. С другой если он будет использоваться редко, то в отличии от локальных, глобальный будет висеть в памяти и без дела занимать ее.

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


    VB.Net - WPF, WinRT, WP

    19 октября 2014 г. 13:13
    Отвечающий
  • Вот так создается глобальный объект? Я правильно понял?

    Не обязательно. Переменная может быть глобальной внутри класса или внутри всего приложения. Когда вы создаете класс, то это глобальный объект для всего приложения. То есть, если вам нужно использовать evt в разных классах, то подойдет ваше решение. Если же он используется только в классе Program, то и объявлять его достаточно там. Делается это так же как вы сделали в классе evtclс. То есть переменная объявляется вне процедур и функций. Причем достаточно объявлять ее private и без static (если я правильно понимаю как это делается в C#).

    Что бы все это понимать лучше конечно читать стаи и книги. В частности вам нужно читать все что касается ООП а C#


    VB.Net - WPF, WinRT, WP

    19 октября 2014 г. 14:23
    Отвечающий

Все ответы

  • Все зависит от частоты использования объекта evt. С одной стороны если он будет использоваться часто, то оптимально создать его глобально, так как это сэкономит тысячные доли секунды на его постоянное создание. С другой если он будет использоваться редко, то в отличии от локальных, глобальный будет висеть в памяти и без дела занимать ее.

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


    VB.Net - WPF, WinRT, WP

    19 октября 2014 г. 13:13
    Отвечающий
  • Вот так создается глобальный объект? Я правильно понял?

    using System;
    using System.IO;
    using System.Diagnostics;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    
        static class evtcl
        {
            public static EventLog evt = new EventLog("Application");
            
        }
        class Program
        {
            
            static void Main(string[] args)
            {
               FileSystemWatcher watch = new FileSystemWatcher();
                watch.Path = @"C:\testapp\";
                watch.EnableRaisingEvents = true;
                watch.Created += new FileSystemEventHandler(watch_Created);
                watch.Deleted += new FileSystemEventHandler(watch_Deleted);
                Console.ReadLine();
            }
    
            static void watch_Deleted(object sender, FileSystemEventArgs e)
            {
                evtcl.evt.Source = "Deleting Watcher";
                evtcl.evt.WriteEntry("Удален файл" + e.FullPath);
            }
            static void watch_Created(object sender, FileSystemEventArgs e)
            {
                evtcl.evt.Source = "Creating Watcher";
               evtcl.evt.WriteEntry("Создан файл" + e.FullPath);
            }
        }

    19 октября 2014 г. 14:12
  • Вот так создается глобальный объект? Я правильно понял?

    Не обязательно. Переменная может быть глобальной внутри класса или внутри всего приложения. Когда вы создаете класс, то это глобальный объект для всего приложения. То есть, если вам нужно использовать evt в разных классах, то подойдет ваше решение. Если же он используется только в классе Program, то и объявлять его достаточно там. Делается это так же как вы сделали в классе evtclс. То есть переменная объявляется вне процедур и функций. Причем достаточно объявлять ее private и без static (если я правильно понимаю как это делается в C#).

    Что бы все это понимать лучше конечно читать стаи и книги. В частности вам нужно читать все что касается ООП а C#


    VB.Net - WPF, WinRT, WP

    19 октября 2014 г. 14:23
    Отвечающий
  • Книжками обложен со всех сторон, увы без практики не укладывается, а с практикой появляются вопросы. 

    Спасибо вам за помощь. Переделал код и создал объект в классе Program, моя ошибка была в том, что я не объявлял его как static, поэтому и не мог использовать из двух нижних методов.

    Получилось вот так

        class Program
        {
            static EventLog evt = new EventLog("Application");
            static void Main(string[] args)
            {
               FileSystemWatcher watch = new FileSystemWatcher();
                watch.Path = @"C:\testapp\";
                watch.EnableRaisingEvents = true;
                watch.Created += new FileSystemEventHandler(watch_Created);
                watch.Deleted += new FileSystemEventHandler(watch_Deleted);
                Console.ReadLine();
            }
    
            static void watch_Deleted(object sender, FileSystemEventArgs e)
            {
                evt.Source = "Deleting Watcher";
                evt.WriteEntry("Удален файл" + e.FullPath);
            }
            static void watch_Created(object sender, FileSystemEventArgs e)
            {
               evt.Source = "Creating Watcher";
               evt.WriteEntry("Создан файл" + e.FullPath);
            }
        }

    Еще раз спасибо. Продолжаю обучение :)

    19 октября 2014 г. 14:30