Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В семнадцатом выпуске рассылки '.Net Собеседник' вы можете прочесть


Информационный Канал Subscribe.Ru

.Net Собеседник #17

Содержание
  1. От автора
  2. Обзор новостей
  3. Статья выпуска - Баллада о конструкторах в C#  
  4. Время кода - Создание пользовательских конфигурационных секций
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Евро-2004 - это не только классный футбол в исполнении лучших команд Европы, но и бессонные ночи и сонные дни после бессонных ночей :) И не смотря на то, что сборная России вылетела, сборная Латвии тоже собирает чемоданы, продемонстрировав хороший футбол, и болеть вроде бы уже не за кого - всё равно остаётся ОН - красивый, мощный, скоростной и зубастый современный футбол. Кто бы мог сказать что сборные Германии, Испании и Италии не выйдут в четвертьфинал? А вот поди ж ты... Кто бы мог подумать, что дубль сборной Чехии выстоит против немцев, девятым валом накатывающихся на ворота Чеха? А ведь выстояли :) Выстояли, продемонстрировав характер. Да и матч с голландцами если не лучший на чемпионате, то - один из лучших однозначно.

Вобщем, болеем за славян! И пусть победит сильнейший.

На этом литературное отступление закончено - желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. Вышел переключатель версий ASP.NET 1.1
    Вышел переключатель версий ASP.NET 1.1 - небольшая утилита, используемая для быстрого переключения версий .NET Framework'a, для которых компилируется страница ASPX. Необходимая вещь для разработчиков, которые часто тестируют свои приложения для разных версий платформы. Удобная утилита, о кторой занют немногие.
  2. Вышел Easy Stock Chart 2.1
    Вышел полностью управляемый компонент для отображения курсов акций. Есть реализация для WebForm и WindowsForm.
  3. Обновился компонент .netCHARGE 3.5 Credit Card Component для ASP.NET
    В .netCHARGE 3.5 добавлена поддержка процессора Vital (VisaNet). Всего поддерживается более 35 основных процессоров и шлюзов.
BUGs, FIXes and HOW TO's -
  1. You receive a "logon failure: unknown user name or bad" error message while accessing remote security-enhanced resources from an ASP.NET application
  2. Support WebCast: Programming DTS With Visual C#.NET
  3. FIX: Internet Explorer times out when it opens an ASPX page and when it uses Big-IP, SQUID Proxy Server software, SSL, and HTTP/1.0
  4. You may receive error messages when you try to open an .aspx page in ASP.NET or in Visual Studio .NET
  5. INFO: ASP.NET hotfix rollup
  6. FIX: A deadlock occurs when you repeatedly load and then unload the Dbnetlib DLL
  7. MS04-017: Vulnerability in Crystal Reports Web viewer re-distributed with Visual Studio .NET could allow information disclosure and denial of service
  8. BUG: When you build a solution that contains multiple projects, Visual Studio .NET 2002 may stop responding if the BoundsChecker tool is integrated with Visual Studio .NET 2002
  9. BUG: An exception error occurs when you pass VARIANT parameters by reference to an MFC IDispatch COM Component in Visual Studio .NET 2002
  10. FIX: The layout of a control on an inherited Windows form may change
  11. FIX: Controls disappear from the Windows Forms Designer in Visual Studio .NET 2003
  12. FIX: You experience high CPU usage and other problems when you run a .NET Framework 1.1 application
  13. ORALONG.EXE: Use RDO with Oracle LONG/LONG RAW Datatypes

{К содержанию}

Статья выпуска

Баллада о конструкторах в C# 

ЯЗЫК: ASP.Net
Автор статьи: Чужа В.Ф. ака hDrummer http://dotnetgrains.sql.ru/
Дата написания : февраль 2003 г.


Dimidium facti, qui coepit, facit.
Horatius.


Половина дела сделана, если оно начато.
Гораций.

C# (читается: си шарп) - простой, современный объектно-ориентированный язык общего назначения, разработанный в компании Microsoft. Казалось бы – какой смысл в создании ещё одного языка программирования, в то время как и на данный момент их существует великое множество? Цели, поставленные перед разработчиками C#, могут помочь ответить на этот вопрос: наряду с простотой, язык должен был придерживаться принципов поддержки строгой типизации, проверки границ массивов, выявлять попытки использования не проинициализированных переменных, обеспечивать автоматическую сборку мусора. Также признавались важными такие характеристики будущего языка как ясность (лёгкость чтения написанных на нём программ) и продуктивность (простота разработки программ). Язык должен был обеспечить разработку программ и программных компонент, предназначенных для распространения в распределённых средах, написание приложений как для обычных, так и для встроенных операционных систем. Важными чертами языка должны были стать лёгкость его освоения программистами, пишущими на С и С++, а также переносимость кода, написанного на этих языках, в C#. Кроме того, одной из основных целей при разработке языка определялась интернационализация – приложение, разрабатываемое на C# не должно было зависеть от национальных стандартов (язык, валюта и т.д.), но в то же время должно иметь возможность отображать данные согласно тем самым национальным стандартам.

В итоге, в июле 2000 года компанией Microsoft впервые была широко представлена первая реализация этого языка в рамках инициативы .Net Framework.
Поскольку этот язык является объектно-ориентированным языком, дадим несколько определений, которые пригодятся нам по ходу данной статьи и рассмотрим особенности реализации в нём конструкторов.
Гради Буч, известный идеолог и популяризатор идей объектно-ориентированного программирования (ООП) и проектирования, в своей книге «Объектно-ориентированное проектирование с примерами применения» дал следующие определения для основных сущностей ООП, используемых в этой статье:
«Класс – множество объектов, связанных общностью структуры и поведения».
«Объект обладает состоянием, поведением и индивидуальностью; структура и поведение схожих объектов определяют общий для них класс; термины «экземпляр класса» и «объект» - взаимозаменяемы».
«Конструктор – операция создания и (или) инициализации объекта».

Что такое конструктор в C#?

В C# существенно расширено классическое понятие конструктора - здесь конструктор выступает не только как способ создания и инициализации объекта (см. Таблицу 1).

Таблица 1. Виды конструкторов классов в C#.

Тип конструктора Использование
Конструктор объекта (экземпляра класса) Используется для создания и инициализации объектов данного класса
Private (частный) Подтип конструктора экземпляра класса, который не может быть доступен вне данного класса. Как следствие объект этого класса не может быть создан.
Static (статический) Конструктор-инициализатор класса, вызываемый до создания первого объекта этого класса или обращения к статическим членам данного класса.

В данном случае под «созданием объекта» понимается выделение памяти для этого объекта, под «инициализацией объекта» - присвоение полям объекта некоторых значений. Однако необходимо отметить, что, описывая некий класс в C#, можно не указывать явно конструктор данного класса (см. Листинг 1). В этом случае, происходит автоматическое создание общедоступного (public) конструктора класса, при создании объекта данного класса поля его инициализируются в значения по умолчанию.

using System;
namespace ConstructorsInCSharp
{
class MainClass
{
[STAThread]
static void Main(string[] args)
{
//Используем конструктор по умолчанию для создания объекта
ConstructorTest ct = new ConstructorTest();
Console.WriteLine("Температура {0}, влажность {1}.", ct.temerature, ct.humidity);
//Консоль выведет:
//Температура 0, влажность 0.
}
}

class ConstructorTest
{
public float temerature;
public int humidity;
}
}
Листинг 1. Пример автоматического создания конструктора по умолчанию.

Обязательным условием для объявления конструктора класса в C# является совпадение имени конструктора класса и имени класса. С другой стороны, класс может иметь более одного конструктора – однако и в этом случае все они должны иметь имена, одинаковые с именем класса. Количество и тип передаваемых переменных в такие конструкторы может быть различным. Конструктор не возвращает никаких значений никакого типа – даже типа void. Объявление нескольких конструкторов в одном классе называется перегрузкой конструкторов. Иногда представляется интересным использовать вызов непараметрического конструктора, задав собственные значения полей по умолчанию с помощью инициализатора this. Также можно осуществить передачу параметров конструктору базового класса с помощью инициализатора base (см. Листинг 2.).

using System;

namespace ConstructorsInCSharp {

class MainClass
{
[STAThread]
static void Main(string[] args)
{
//использование конструктора по умолчанию
ConstructorTest ct = new ConstructorTest();
//использование параметрического, перегруженного конструктора
ConstructorTest ct1 = new ConstructorTest(30, 78);
//создание обекта класса-наследника
ConstructorTestChild ctCh = new ConstructorTestChild();
//консоль
Console.WriteLine("Температура {0}, влажность {1}.", ct.temperature, ct.humidity);
Console.WriteLine("Температура {0}, влажность {1}.", ct1.temperature, ct1.humidity);
Console.WriteLine("Температура {0}, влажность {1}.", ctCh.temperature, ctCh.humidity);
//Консоль выведет:
//Температура 0, влажность 60.
//Температура 30, влажность 78.
//Температура 20, влажность 100.
}
}

class ConstructorTest
{
public float temperature;
public int humidity;
//меняем инициализацию по умолчанию
public ConstructorTest(): this(0,60)
{
}
//добавляем параметрические конструкторы
public ConstructorTest(float t, int h)
{
temperature = t;
humidity = h;
}
public ConstructorTest(int h)
{
humidity = h;
}
}
//производный класс
class ConstructorTestChild : ConstructorTest
{
public ConstructorTestChild(): base(20,100) { }
}}
Листинг 2. Использование перегруженных конструкторов и конструкторов с инициализаторами this и base.

До сих пор мы использовали конструктор с областью видимости public, однако можно создать конструктор с любой областью видимости – public, protected, internal или private. Смысл использования конструктора с модификатором private заключается в том, что объекты классов с защищённым конструктором не могут быть созданы (разве что во вложенных классах) и используются тогда, когда класс содержит только статические члены – как поля, так и методы. Объявление непараметрического конструктора класса с модификатором private также препятствует автоматическому созданию общедоступного (public) конструктора данного класса (см. Листинг 3).

using System;

namespace ConstructorsInCSharp01
{
class ConstructorsInCSharp01
{
[STAThread]
static void Main(string[] args)
{
//попытка создания объекта данного класса приведёт к ошибке
//BritainUnits bu = new BritainUnits();
//доступ к полям класса можно получить без создания объекта
Console.WriteLine("дюйм = {0}м, фут = {1}м,"+
"миля уставная = {2}м, миля морская = {3}м",
BritainUnits.inch,BritainUnits.foot,
BritainUnits.mile_ustav, BritainUnits.mile_sea);
//Консоль выведет:
//дюйм = 0,0254м, фут = 0,3048м,миля уставная = 1609,344м, миля морская = 1852м
}
}
class BritainUnits
{
//запрещаем создание объектов данного класса
private BritainUnits(){}
//объявляем статические поля только для чтения
public readonly static float inch = 0.0254F;
public readonly static float foot = 0.3048F;
public readonly static float mile_ustav = 1609.344F;
public readonly static float mile_sea = 1852.0F;
}
}
Листинг 3. Использование приватного конструктора и статических полей с модификатором «только для чтения».

Использование инициализации полей класса в месте их объявления не является классическим подходом в ООП, хотя и представляется удобным. Более традиционным подходом является инициализация статических полей с помощью статического конструктора. Однако необходимо указать некоторые ограничения и особенности, присущие статическим конструкторам. Во-первых, такой конструктор не содержит модификаторов доступа и не может принимать параметры. Во-вторых, статический конструктор не может быть вызван явно – он вызыватеся автоматически перед созданием объекта класса или обращением к статическим членам класса. Изменим предыдущий пример таким образом, чтобы инициализация полей проходила в конструкторе. Также добавим индикацию отработки конструктора (выведем на экран сообщение), для того, чтобы убедиться в том, что конструктор вызывается автоматически до обращения к полям класса (см. Листинг 4).

using System;

namespace ConstructorsInCSharp01
{
class ConstructorsInCSharp01
{
[STAThread]
static void Main(string[] args)
{
//использование статического конструктора
//доступ к полям класса можно получить без создания объекта
Console.WriteLine("дюйм = {0}м, фут = {1}м,"+
"миля уставная = {2}м, миля морская = {3}м",
BritainUnits.inch,BritainUnits.foot,
BritainUnits.mile_ustav, BritainUnits.mile_sea);
//Консоль выведет:
//Поля класса проинициализированы
//дюйм = 0,0254м, фут = 0,3048м,миля уставная = 1609,344м, миля морская = 1852м
}
}

class BritainUnits
{
//используем статический конструктор
static BritainUnits()
{
inch = 0.0254F;
foot = 0.3048F;
mile_ustav = 1609.344F;
mile_sea = 1852.0F;
//индикация вызова статического конструктора
Console.WriteLine("Поля класса проинициализированы");
}
//объявляем статические поля только для чтения
public readonly static float inch;
public readonly static float foot;
public readonly static float mile_ustav;
public readonly static float mile_sea;
}
}
Листинг 4. Использование статического конструктора с демонстрацией его вызова до обращения к статическим полям класса.

Выводы

Подробно рассмотрев возможности конструкторов в языке C#, убеждаешься в том, что язык предоставляет достаточно простые и мощные средства для создания объектов и работы со статическими членами классов. Можно с уверенностью сказать, что разработчики добились поставленных целей – ясность конструкций и простота разработки программ на C# впечатляют. Да это и не удивительно – ведь ведущими разработчиками языка являются Андерс Хейльсберг (Anders Hejlsberg) – разработчик Turbo Pascal и глава команды, разрабатывавшей Delphi, Скотт Вилтамут (Scott Wiltamuth) и Питер Голд (Peter Golde). Поэтому, если жажда познания в вас ещё не угасла, а любознательность – присущая вам черта, попробуйте C# - я думаю, вам понравится.

{К содержанию}

Время кода

Создание пользовательских конфигурационных секций

ЯЗЫК: C#
АВТОР: Bipin Joshi,
http://www.dotnetbips.com/
ПЕРЕВОД: Чужа В.Ф ака hDrummer

Вступление

ASP.NET позволяет нам хранить наши настройки в секции <appSettings> файла web.config в виде пар ключ-значение. Такой подход хорошо работает, если таких пар немного. Однако, если их становится много, то с ними становится нелегко работать. Хорошей новостью является то, что ASP.NET позволяет определять свои секции для хранения своих настроек. В этой статье мы и рассмотрим как создать свои конфигурационные секции и получать к ним доступ в коде.

Обработчики секций

Файл web.config содержит несколько секций и каждая такая секция обрабатывается специальным обработчиком. Обраотчик секции это ни что иное, как класс, реализующий интерфейс IConfigurationSectionHandler. В этой статье мы не станет углубляться в детали этого интерфейса, а рассмотрим как можно использовать встроенный обработчик секции. В самом файле web.config можно указать обработчик какой-то конкретной секции.

Указываем обработчик секции

Предположим, что мы хотим создать вот такую конфигурационную секцию:

<sitesettings>
<common>
<emails>
<add key="adminmail" value="administrator@somedomain.com"/>
<add key="salesmail" value="sales@somedomain.com"/>
<add key="supportmail" value="support@somedomain.com"/>
<add key="admail" value="advertising@somedomain.com"/>
</emails>
</common>
</sitesettings>

Здесь мы также храним пары ключ-значение, но они вложены в другие тэги.
Теперь, когда мы знаем, какой должна быть наша секция, давайте укажем в web.config каким образом она должна быть обработана. В .NET есть встроенный обработчик секций NameValueSectionHandler, который размещается в пространстве имён System.Configuration. Этот обработчик ответственен за обработку секций, хранящих пары ключ-значение (таких, как ). Мы используем его для нашей секции.

<configuration>
<configSections>
<sectionGroup name="sitesettings">
<sectionGroup name="common">
<section name="emails" type= "System.Configuration.NameValueSectionHandler,System"/>
</sectionGroup>
</sectionGroup>
</configSections>
... ... ...

Читаем значения пар в коде

А читаются они так:

NameValueCollection nvc = (NameValueCollection)ConfigurationSettings.GetConfig("sitesettings/common/emails");
Label1.Text = nvc["salesmail"];
Label2.Text = nvc["supportmail"];
Label3.Text = nvc["adminmail"];
...
...

Итого

В этой статье мы увидели каким образом можно создавать свои конфигурационные секции в файле web.config. Секции файла web.config обрабатываются классами, реализующими интерфейс IConfigurationSectionHandler. Мы используем класс NameValueSectionHandler, который обрабатывает секцию <appSettings> файла web.config.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

Генерация Exel с помощью ASP
добавление удаление в DataGrid
Помогите извлечь данные из массивов!
Session
Panel с детьми в DesignTime
Авторизовать только пользователей домена.
ADODB.Recordset не хочет добавлять поля... почему?
Digest аутентификация
Infragistics UltraCombo
SyBase UltraLite.NET
Помогите с отчетом



На этом семнадцатый выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения, вопросы и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться

В избранное