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

Поиск:

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


Бывалый
*


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

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



Господа, обьясните мне,недалекому, что аткое конструктор-деструктор ,для чего он нужон и как им юзаться плиз. К Троелсону не отсылать=)

Добавлено @ 12:53 
В чем различие между статическим конструктором констурктором ,конструктором с параметрами и как использовать статический конструктор в качестве счетчика обьектов? 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Pitc
Дата 1.5.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Конструктор по умолчанию выделяет память  и инициализирует объект, в C# конструктор присваевает данным значения по умолчанию, чаще всего 0.
В большинстве случаев класс снабжен и другими конструкторами принимающими праметры. Использование такого конструктора самы простой способ инициализировать  состояние объекта в момент его создния, установив нужные значения.

Назначение статических конструкторов- присваивать начальные значения статическим переменным. 
PM MAIL ICQ   Вверх
Сарт
Дата 1.5.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Шустрый
*


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

Репутация: нет
Всего: 2



Использование статического конструктора:
Дапустим нуна чтоб статической переменной color всегда при создании присваевалось значение black. 
Код

public class NewClass
{
///.....
    private static string color;
    static NewClass()
    {
          color = "black";
     }
///.....
}



/////////////
public static int Main(string[] args)
{
     Console.WriteLine("Color is :{0}",NewClass.color);
}
  

Это сообщение отредактировал(а) Pitc - 1.5.2006, 13:21
PM MAIL ICQ   Вверх
Сарт
Дата 1.5.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



гм а почему нельзя то же самое через метод сделать??
примерно так:
Код

public class NewClass
{
///.....
   public static string color;
   color="black";
      
///.....
}

public static int Main(string[] args)
{
     Console.WriteLine("Color is :{0}",NewClass.color);
}




 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Pitc
Дата 1.5.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 2



Вообще я у тебя метода не вижу.. smile 
Цитата

public class NewClass    
{    
///.....    
   public static string color;    
   color="black";    
       
///.....    
}


Добавлено @ 13:54 
Если использовать метод ,то потом его надо будет вызвать перед использованием переменной color, а уже потом обращаться к переменной.  
PM MAIL ICQ   Вверх
Сарт
Дата 1.5.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



упс ступил

public class NewClass
{
///.....
public void Colour()
{
   public  string color;
   color="black";
Console.WriteLine("Цвет ремешка"+colour);
  }    
///.....
}

public static int Main(string[] args)
{
     NewClass c1= new NewClass();
     c1.Colour
}
 
--------------------
[color=purple][/color]Died.Of course, System.StackOverflow 
PM MAIL   Вверх
Wanderer2019
Дата 1.5.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



деструктор - есть понятие обратное конструктору. т.е. освобождает память. Не знаю насколько он необходим в C#, но вот в C++ он использовался для освобождения памяти выделяемой под определенные поля объекта. т.к. деструктор по умолчанию этого не делал. Соответсвенно ты можешь и не описывать не конструкто ни деструктор, тогда шарп сам проинициализирует все поля для создаваемого объекта (значениями типа null или 0), однако здесь могу возникнуть проблемы в случае если в качестве полей у тебя выступают например массивы и т.п., тогда при обращении к полю объекта через какой либо метод компилятор ругнется что значение данной переменной неопредлено.
 
PM ICQ MSN   Вверх
ivashkanet
Дата 1.5.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Значит так. Все что написано сверху верно, но хочу вставить свои пять копеек.

Назначение конструкторов -- проводить начальную инициализацию объекта. Все равно какую.
Деструктора -- высвобождение ресурсов, которые не может высвободить сборщик мусора, после удаления объекта. Например закрытие открытых файлов.

Цитата(Сарт @  1.5.2006,  13:42 Найти цитируемый пост)
   public static string color;    
   color="black";

Так не пойдет,    color="black"; -- это инструкция (комманда) она не может быть написана вне метода. Выскочит ошибка этапа компилирования, но значение полю можно присвоить и по-другому:
Код

   public static string color = "black";

Где ее инициализировать -- вопрос вкуса smile , но в конструкторе можно сделать более сложную инициализацию. Например просканировать другие классы (например запущенные процессы) и на этом основании заполнить свои поля.
Другой пример: в конструкторе формы-по-умолчанию присутствует метод InitializeComponent(); , который расставляет контролы на форме, накиданные нами в дизайнере.
Код

 public Form1()
        {
            InitializeComponent();
        }


Цитата(Pitc @  1.5.2006,  13:03 Найти цитируемый пост)
Назначение статических конструкторов- присваивать начальные значения статическим переменным. 

Не только.
Статический конструктор вызываеться один раз, перед созданием самого первого экземпляра класса. Он нужен, например, для инициализации констант класса. Ведь они имееют тип того же класса, а экземпляров его еще нет smile Вот он и позволяет выкрутиться.
Класс описывающий рациональные числа и его статический конструктор:
Код

static Rational()
{
   Console.WriteLine("static constructor Rational");
   Zero = new Rational(0, 1);
   One = new Rational (1, 1);
}

Назначение конструктора с параметрами нужно для более удобного присвоения значений полям нового класса. А для класса Rational подругому и нельзя только:
Код

Rational RatNumber = new Rational(1,2);  // создаем новое число 1/2


Что еще осталось? А!
Как вести подсчет количества объектов:
Нужно статическое (общее на все классы) поле counter. И увеличивать его на 1 при каждом создании нового объекта:
Код

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

P.S. И еще конструктор без параметров свегда вызывается самым первым в конструкторе с параметром (могу ошибаться, но по-моему так оно и есть) 
PM MAIL WWW ICQ   Вверх
Void
Дата 1.5.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(ivashkanet @  1.5.2006,  21:42 Найти цитируемый пост)
Деструктора -- высвобождение ресурсов, которые не может высвободить сборщик мусора, после удаления объекта.

Во-первых, в C# деструкторов нет, а есть финализаторы, по недоразумению обладающие синтаксисом деструкторов.
Во-вторых, для высвобождения unmanaged ресурсов существует паттерн IDisposable и финализаторы писать обычно не рекомендуется.

Добавлено @ 20:06 
Цитата(ivashkanet @  1.5.2006,  21:42 Найти цитируемый пост)
И еще конструктор без параметров свегда вызывается самым первым в конструкторе с параметром

Если явно не указан — не вызывается. 


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


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


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

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



Цитата(Void @  1.5.2006,  20:03 Найти цитируемый пост)
Во-первых, в C# деструкторов нет, а есть финализаторы

Знать ничего не знаю, вот что напиано в MSDN про destructors:
Цитата

Destructors are used to destruct instances of classes.
Remarks:
Destructors cannot be defined in structs. They are only used with classes.
A class can only have one destructor.
Destructors cannot be inherited or overloaded.
Destructors cannot be called. They are invoked automatically.
A destructor does not take modifiers or have parameters.

For example, the following is a declaration of a destructor for the class Ca
Код

class Car
{
    ~ Car()  // destructor
    {
        // cleanup statements...
    }
}

Цитата(Void @  1.5.2006,  20:03 Найти цитируемый пост)
 IDisposable

А что, если я открываю 1 несчастный файл мне для его корректного закрытия переписывать все методы IDisposable. И не подумаю smile 

Цитата(Void @  1.5.2006,  20:03 Найти цитируемый пост)
Если явно не указан — не вызывается. 

Да, не вызывается. 
А с чего я это взял ...  smile 

P.S. В двух словах о деструкторе -- это такой зверь который вызывается самым последним при уничтожении объекта.
 
PM MAIL WWW ICQ   Вверх
Void
Дата 1.5.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(ivashkanet @  1.5.2006,  23:38 Найти цитируемый пост)
А что, если я открываю 1 несчастный файл мне для его корректного закрытия переписывать все методы IDisposable. И не подумаю smile 

Зря.

Спорить не буду, почитай у Рихтера про завершение и вот эту статью. 


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


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


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

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



Только что глянул Idisposable, в нем оказался всего 1 метод Dispose(). Наследовать его можно, не страшно.  smile 
Но вот когда он вызывается? 
Вручную -- не интересно smile 

Кстати. В MSDN в примере к статье про Idisposable метод Dispose() вызывается примо из деструктора smile 
Цитата

~MyResource()      
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.
            Dispose(false);
        }

Цитата

            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.

оптимален для читаемости и отладки smile  
PM MAIL WWW ICQ   Вверх
Void
Дата 1.5.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(ivashkanet @  2.5.2006,  00:01 Найти цитируемый пост)
Вручную -- не интересно

Полуавтоматически — с помощью using-блоков. 


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


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


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

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



Цитата(Void @  1.5.2006,  21:48 Найти цитируемый пост)
Спорить не буду, почитай у Рихтера про завершение и вот эту статью. 

Спасибо за статью, заставляет задуматься. 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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