ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

  << Предыдущий пост       Следующий пост >>  
От: ironMan
8. августа 2011 04:16

Одно из величайших преимуществ языков ООП, таких как С#, состоит в том, что вы можете определять специальные методы, вызываемые всякий раз при создании экземпляра класса. Эти методы называются конструкторами (constructors). C# вводит в употребление новый тип конструкторов — статические (static constructors), с которыми вы познакомитесь ниже в подразделе «Константы и неизменные поля». Гарантия инициализации объекта должным образом, прежде чем он будет использован,— ключевая выгода от конструктора. Когда пользователь создает экземпляр объекта, вызывается его конструктор, который должен вернуть управление до того, как пользователь сможет выполнить над объектом другое действие. Именно это помогает обеспечивать целостность объекта и делать написание приложений на объектно-ориентированных языках гораздо надежнее. Но как назвать конструктор, чтобы компилятор знал, что его надо вызывать при создании экземпляра объекта? Разработчики С# последовали в этом вопросе за разработчиками C++ и провозгласили, что у конструкторов в С# должно быть то же имя, что и у самого класса. Вот простой класс с таким же простым конструктором:



using System;
class Constructor1Лрр
{
ConscrucrorlApp(]
{
Console. Wr±:eLine("a конструктор.") ;
}
public static void Main(]
{
ConstructorlAp app = new ConstruotorlApp();
}
}



Значений конструкторы не возвращают. При попытке использовать с конструктором в качестве префикса имя типа компилятор сообщит об ошибке, пояснив, что вы не можете определять члены с теми же именами, что у включающего их типа. Следует обратить внимание и на способ создания экземпляров объектов в С#. Это делается при помощи ключевого слова new:



<класс> <объект> = new <класс>(аргументы конструктора)



Если раньше вы программировали на C++, обратите на это особое внимание. В C++ вы могли создавать экземпляр объекта двумя способами: объявлять его в стеке, скажем, так:



/* Код на Си++ Создает экземпляр CMyCleas в стеке */
CMyClass rr.yClass;



или создавать копию объекта в свободной памяти (или в куче), используя ключевое слово C++ new:



/* Код на С++. Создает экземпляр CMyCiass в куче */
CMyCloss myClass = new CmyClassf);



Экземпляры объектов на С# формируются иначе, что и сбивает с толку новичков в разработке на С#. Причина путаницы в том, что для создания объектов оба языка используют одни и те же ключевые слова. Хотя с помощью ключевого слова new в C++ можно указать, где именно будет создаваться объект, место его построения на С# зависит от типа объекта, экземпляр которого создается. Как вы уже знаете, ссылочные типы создаются в куче, а размерные — в стеке. Поэтому ключевое слово new позволяет делать новые экземпляры класса, но не определяет место создания объекта. Хотя можно сказать, что приведенный ниже код на С# не содержит ошибок, он делает совсем не то, что может подумать разработчик на C++:


MyClass myClass;


На C++ он создаст в стеке экземпляр MyClass. Как сказано выше, на С# вы можете создавать объекты, только используя ключевое слово new. Поэтому на С# эта строка лишь объявляет переменную myClass как переменную типа MyClass, но не создает экземпляр объекта. Примером служит следующая программа, при компиляции которой компилятор С# предупредит, что объявленная в приложении переменная ни разу не используется:



using System;
class Construetor2App
{
Consructor2App()
{
Console.WriteLine("я конструктор");
}
public static void Main()
{
Consructor2App app;
}
}



Поэтому, объявляя объект, создайте где-нибудь в программе его экземпляр с помощью ключевого слова new:



...
Construotor2App app;
...
app = new Constructor2App() ;
...



Зачем объявлять объект, не создавая его экземпляров ? Объекты объявляются перед использованием или созданием их экземпляров с помощью new, если вы объявляете один класс внутри другого. Такая вложенность классов называется включение (containment) или агрегирование (aggregation).

( отрывок из книги В. В. Лабор "Си Шарп: Создание приложений для Windows" )

 

Похожие записи


Инициализация конструкторов в C# и base
Во всех конструкторах С#, кроме System.Object, конструкторы базового класса вызываются прямо перед исполнением первой строки конструктора. Эти инициализаторы конструкторов позволяют задавать класс и подлежащий вызову конструктор. Они бывают двух видов. Инициализатор в виде base(...) активизирует конструктор базового класса текущего класса. Инициализатор в виде this(.....

Многопоточный HTTP сервер на C#
Оригинал статьи здесь: Многопоточный сервер на C# за 15 минут Автор (на хабре): ertaquo C# довольно простой и гибкий язык. Вместе с .NET поставляется довольно много уже готовых классов, что делает его еще проще. Настолько, что вполне можно написать простой многопоточный HTTP-сервер для отдачи статического содержимого всего за 15 минут. Можно было бы использовать уже...

Вопросы на собеседовании C#, Net, ASP.NET, SQL
Продолжая тему вопросов на собеседовании. Нашел еще одну подборку. Оригинал лежит здесь . Перенес, чтобы не затерялось. Есть вполне вменяемые ответы (хотя, на некоторые вопросы ответил бы по-другому). Ответы находятся после списка вопросов, я их не менял. 23. Что такое шаблон проектирования Model/View/Controller? Как и зачем его применяют? 2...

Добавить комментарий




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий