Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по С#, мои ламерские вопросы о всем 
:(
    Опции темы
Сарт
Дата 3.5.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Народ, разрешите прервать вашу столь увлекательную беседу, но у меня возник вопрос. КУДА писать деструктор при создании счетчика объектов? Ведь его.как подсказывает мне логика, нужно каким то образом не только увеличивать,но и уменьшать....Пример:Создан объект, создан 2-ой. Счетчик показывает 2. 1 объект удалили,но счетчик то все равно покажет 2=)) Помогите плиз,и куджа писать деструктор??...
Могу выложить код но он несколько..сумбуренЮ,что ли?? 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
ivashkanet
Дата 3.5.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Сарт @  3.5.2006,  20:19 Найти цитируемый пост)
 КУДА писать деструктор при создании счетчика объектов?

Да, эт я ломанулся. А вопрос даже не КУДА, а КАК писать деструктор
Код

   class MyClass    
    {    
        static int counter = 0;    
        public MyClass()    
        {    
            counter++;    
        }
        ~MyClass()    
        {    
            counter--;    
        }
    }


 
PM MAIL WWW ICQ   Вверх
Void
Дата 3.5.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Цитата(Сарт @  3.5.2006,  22:19 Найти цитируемый пост)
Пример:Создан объект, создан 2-ой. Счетчик показывает 2. 1 объект удалили,но счетчик то все равно покажет 2=))

Проблема в том, что заранее неизвестно, когда сборщик мусора подберет объект. Время жизни объектов в .NET недетерминированно, так что не удивляйся, что счетчик будет сбрасываться с некоторым запозданием. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Сарт
Дата 3.5.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Создать деструктор класса, 
Цитата

определить момент его вызова 


Народ расшифруйте фразу 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
mr.DUDA
Дата 4.5.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Сарт @  3.5.2006,  22:18 Найти цитируемый пост)
Народ расшифруйте фразу

Деструктор вызывается автоматически сборщиком мусора. Для тебя это означает: время ,когда деструктор будет вызван, неизвестно. Хоть через минуту, хоть через две. Притом, что ссылок на объект уже давно 0. 


--------------------
user posted image
PM MAIL WWW   Вверх
Сарт
Дата 4.5.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Сегодня пристал к преподу довел его этим вопросом....Итак внимание,правильный ответ!!!!!!!
фраза 
Цитата

определить момент его вызова 

Означает...что бы вы подумали?? А не что иное как код вида:
Код

~Clock()
Console.WriteLine("Деструктор вызван");


Я плакалЪ... 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
ivashkanet
Дата 5.5.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Сарт @  4.5.2006,  23:07 Найти цитируемый пост)
~Clock()

В топку твоего препода smile 
Номер раз: Деструкторы одычно имеют private модификатор и поэтому вызвать его из кода вне класса невозможно.
Номер два: Деструктор не уничтожает объект (действительно слово для него неправильное выбрали, лучше уж финализатор), а только делает предварительные действия перед удалением объекта.
Номер три: если уж хочешь сам удалить объект нужно делать так: Убираешь все с него ссылки, и дважды smile  (ИХМО, бред, но так говорит статья предложенная выше) вызываешь сборщика мусора  и между вызовами ждешь пока он закончит финализацию smile 
Код

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
 
PM MAIL WWW ICQ   Вверх
Сарт
Дата 5.5.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Пасиб,чувствую сча прочитаю Троелсона страниц 20 и снова какой нить мелкий вопрос задам=)) 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Сарт
Дата 5.5.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Вопрос возник УЖЕ=)
Итак вот код:
Код

using System;


namespace Lab01
{
    /// <summary>
    /// Обьявление класса Часы
    /// </summary>
    public class Clock
    {    
        /// <summary>
        /// Обьявление переменных типа string, содержащих информацию о дате изготовления,стране изготовления, марке часов, цвете стрелок, цвете фона, цвете цифр
        /// </summary>
        protected string God="2005";
        private string Country="Беларусь";
        public string Model="Z1527";
        private string ArrowColour="Черный";
        private string FoneColour="Белый";
        private string NumberColour="Желтый";
        public string day,mounth,year;
        public static int ObjCount;
        public int intX;
        /// <summary>
        /// Обьявление класса Info,содержащего информацию о дате изготовления часов,стране и модели.
        /// </summary>
        public void Info()
        {   ///
            /// Вывод информации на экран
            ///
            Console.WriteLine("Год выпуска "+God);
            Console.WriteLine("Страна-производитель "+Country);
            Console.WriteLine("Модель "+Model);
            
        }
        /// <summary>
        /// обьявление метода Дизайн
        /// </summary>
        public void Design()
        {///Вывод информации о цвете стрелок,фона и цифр
            Console.WriteLine("Цвет стрелки "+ArrowColour);
            Console.WriteLine("Цвет фона "+FoneColour);
            Console.WriteLine("Цвет цифр "+NumberColour);
        }
        /// <summary>
        /// Обьявление SetLong, в котором содержиться информация о батарее
        /// </summary>
        /// <param name="otherValue"></param>
        

        public void SetLong()
        {
            Console.WriteLine("Заряда батареи достаточно для работы в течении 5 дней");
        }
        /// <summary>
        /// Обьявление 
        /// </summary>
        public void  GravirovkaStekla()
        {
            ///Обьявление переменной типа string, служащей для хранению информации, считанной с экрана.
            string s;
            Console.WriteLine("По умолчанию гравировка отсутсвует,но вы можете добавить надпись ");
            Console.WriteLine("Введите текст гравировки ");
            s=Console.ReadLine();
            Console.WriteLine("Теперь на ваших часах гравировка-надпись: "+s );
        }
        public void ZariadBatarei()
        {    
            string s;
            Console.WriteLine("Какое количество дней батарея уже проработала?");
            s=Console.ReadLine();
            ///Метод высчитывания того,на сколько хватит батареи
            if (Convert.ToInt32(s)==0)
            {
                Console.WriteLine("Заряда батареи хватит еще на 5 дней");
            }
            if (Convert.ToInt32(s)<0)
            {
                Console.WriteLine("Введена неверная информация");
            }
            if (Convert.ToInt32(s)!=0 && Convert.ToInt32(s)>0)
            {
                int rezult;
                rezult=Math.Abs(5-Convert.ToInt32(s));
                Console.WriteLine("Заряда батареи хватит еще на : "+rezult );
            }
        }
        public void Data()
        {
            ///Установка даты.
            
            Console.WriteLine("Введите дату:");
            day=Console.ReadLine();
            Console.WriteLine("Введите месяц:");
            mounth=Console.ReadLine();
            Console.WriteLine("Введите год:");
            year=Console.ReadLine();
            if (Convert.ToInt32(day)<31 && Convert.ToInt32(day)>1 && Convert.ToInt32(mounth)<12 && Convert.ToInt32(mounth)>1 &&Convert.ToInt32(year)>=2006)
                {
                Console.WriteLine("Теперь дата установленна.");
                Console.WriteLine("Сейчас день номер: "+day);
                Console.WriteLine("Месяц номер: "+mounth);
                Console.WriteLine("И год под номером: "+year);
                    }
            else Console.WriteLine("Ошиблись вводом");
            
                
            }
        
        /// <summary>
        /// Обьявление статической переменной RemeshokColour отвечающей за цвет ремешка часов;
        /// </summary>
        public static string RemeshokColour;
        /// <summary>
        /// Обьявление статического конструктора
        /// </summary>
         static Clock()
        {
            RemeshokColour="black";
        }
        public Clock(int x)
        {
             intX=x;
        }
        public Clock ()
        {
           ObjCount++;
            Console.WriteLine("Количество созданных объектов: "+ObjCount);
         }
        ~Clock()
    
    {
            Console.WriteLine("Здесь используется деструктор");
                ObjCount--;
        }
        }

        }

    

        







А вопрос следующий,почему при выходе из проги(если надо могу выложить код с Маина, фраза 
Цитата

Здесь используется деструктор


выводиться 2!! раза?? 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
ivashkanet
Дата 5.5.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Сарт, очисти код от всего лишенего. Читать же невозможно.
А какой метод вызывает функция main smile  
PM MAIL WWW ICQ   Вверх
Сарт
Дата 5.5.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Гм а что там лишенго то?? комментарии??=)
а вот код с маином
Код

using System;

namespace Lab01
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        public static int Menu()
        {
            Console.WriteLine("1.Выход из программы");
            Console.WriteLine("2.Посмотреть дизайн часов");
            Console.WriteLine("3.Вывести Инфу");
            Console.WriteLine("4.Заряд батареи");
            Console.WriteLine("5.Сделать гравировку на часах");
            Console.WriteLine("6.Узнать,на сколько дней еще хватит батареи.");
            Console.WriteLine("7.Установить дату");
            Console.WriteLine("8.Посмотреть цвет ремня(using static constructor)");
            Console.WriteLine("9.Узнать гарантийный срок (using default constructor)");
            return Convert.ToInt32(Console.ReadLine());
        }
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Clock n2= new Clock();
            Clock n1 = new Clock(100);
            bool proverka;
            proverka=true;
            while(proverka)
            {
                int str=Menu();
                
                if (str<10 && str>0)
                {
                {
                    if (str==1) 
                    {
                        proverka=false;

                    }
            
                    if (str==2)
                    {
                        n2.Design();
                    }
                    if (str==3)
                    {
                       n2.Info();    
                    }
                    if (str==4)
                    {
                        n2.SetLong();
                    }
                    if (str==5)
                    {
                        n2.GravirovkaStekla();
                    }
                    if (str==6)
                    {
                        n2.ZariadBatarei();
                    }
                    if (str==7)
                    {
                        n2.Data();
                        
                    }
                    if (str==8)
                    {
                        Console.WriteLine("Цвет ремешка: "+Clock.RemeshokColour);

                    }
                    if (str==9)
                    {
                        Console.WriteLine("Гарантийный срок составляет:"+n1.intX);
                    }
                }
                         
                } 
                else
                {
                    Console.WriteLine("Выберите верный пункт меню");
                    str=Menu();
                }
            }
            
        }

    }
    
}


Но поскольку тут нету конструктора то думаю не из за этого=))
А,это лаба,поэтому лишенго нету=)) Или я не прав?? 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
ivashkanet
Дата 5.5.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Сарт,  smile . У меня в таком коде 
Код

    class Program
    {
        static void Main(string[] args)
        {
            Clock cl = new Clock();
        }
    }
    public class Clock
    {
        static int ObjCount = 0;

        public Clock()
        {
            ObjCount++;
        }
        ~Clock()
        {
            Console.WriteLine("Здесь используется деструктор");
            ObjCount--;
        }
    }

1 раз строка выкакивает, а если два объекта создам, то 2 раза  smile

Добавлено @ 16:26 
Цитата(Сарт @  5.5.2006,  16:18 Найти цитируемый пост)
            Clock n2= new Clock();    
            Clock n1 = new Clock(100);

Ты ж два объекта создаешь, вот он и вызывается по разу для каждого

P.S. Все лишнее, это код не относящийся к делу. Вот у меня код без всего лишнего

Добавлено @ 16:28 
Цитата(Сарт @  5.5.2006,  16:18 Найти цитируемый пост)
комментарии??=)

Комментарии никогда лишними не бывают smile  
PM MAIL WWW ICQ   Вверх
Сарт
Дата 5.5.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Ясненько,пасиб......сча дальше буду делать=) 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Сарт
Дата 6.5.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



 Ребята!! Расскажите про композицию и агрергацию, что это такое?? 
Знаю тока что там отличается типом доступа к чему-то там.... Расскажите, как и что там?? 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Сарт
Дата 7.5.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 29.4.2006

Репутация: 1
Всего: 0



Что?? Неужели никто не знает??
 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.