Console.WriteLine("{0} оформил(a) {1} операций…", e.GetFullName, ((SalesPerson)e).NumbSales);

  }

  if (e is Manager) {

   Console.WriteLine("Имя уволенного клерка: {0}", e.GetFullName);

   Console.WriteLine("{0} имел(а) (1} опцион(ов)…", e.GetFullName, ((Manager)e).NumbOpts);

  }

 }

}

Здесь ключевое слово is используется для того, чтобы динамически определить тип работника. Чтобы получить доступ к свойствам NumbSales или NumbOpts, вы должны использовать явное приведение типов. Альтернативой место бы быть ис-пользование ключевого слова as для получения ссылки на производный тип (если типы при этом окажутся несовместимыми, ссылка получит значение null).

SalesPerson p = е as SalesРеrson;

if (p!= null) Console.WriteLinе("Число продаж: {0}", p.NumbSales);

Замечание. Из Главы 7 вы узнаете, что такой же подход (явное приведение типов, is и as) может использоваться при получении интерфейсных ссылок из реализующего типа.

<p>Приведение числовых типов</p>

В завершение нашего обзора операций приведения типов в C# заметим, что преобразование числовых типов подчиняется примерно таким же правилам. Чтобы поместить "больший" числовой тип в "меньший" (например, целое число int в byte), следует использовать явное приведение типов, которое информирует компилятор о том, что вы готовы принять возможную потерю данных.

// Если "х" больше предельного значения для byte, вероятна потеря

// данных, но из главы 9 вы узнаете о "контролируемых исключениях",

// с помощью которых можно управлять результатом.

int х = 6;

byte b = (byte)x;

Когда вы сохраняете "меньший" числовой тип в "большем" (например, byte в int), тип для вас будет преобразован неявно и автоматически, так как здесь нет потерь данных.

// Приведение типа не требуется,

// int достаточно "велик" для хранения byte.

byte b = 30; int x = b;

<p>Парциальные типы C#</p>

В C# 2005 вводится новый модификатор типа partial, который позволяет определять C#-тип в нескольких файлах *.cs. Предыдущие версии языка C# требовали, чтобы весь программный код определения типа содержался в пределах одного файла *.cs. С учетом того, что C#-класс производственного уровня может содержать сотни строк программного кода, соответствующий файл может оказаться достаточно объемным.

В таких случаях было бы хорошо иметь возможность разделить реализацию типа на несколько файлов, чтобы отделить программный код, который в некотором смысле более важен, от других элементов. Например, используя для класса модификатор partial, можно поместить все открытые члены в файл с именем MyТуре_Public.cs, а приватные поля данных и вспомогательные функции – в файл MyType_Private.cs.

// MyClass_Public.cs

namespace PartialTypes {

 public partial class MyClass {

  // Конструкторы.

public MyClass {}

  // Открытые члены.

  public void MemberA {}

  public void MemberB {}

 }

}

// MyClass_Private.cs

namespace PartialTypes {

 public partial class MyClass {

  // Приватные поля данных.

private string someStringData;

  // Приватные вспомогательные члены.

  public static void SomeStaticHelper{}

 }

}

Это, в частности, упростит задачу изучения открытого интерфейса типа для новых членов команды разработчиков. Вместо изучения единого (и большого) файла C# с целью поиска соответствующих членов, разработчики получают возможность рассмотреть только открытые члены. Конечно, после компиляции этих файлов с помощью csc.exe в результате все равно получается единый унифицированный тип (рис. 4.14).

Рис. 4.14. После компиляции парциальные типы уже не будут парциальными

Исходный код. Проект PartialTypes размещен в подкаталоге, соответствующем главе 4.

Замечание. После рассмотрения Windows Forms и ASP.NET вы поймете, что в Visual Studio 2005 ключевое слово partial используется для разделения программного кода, генерируемого инструментами разработки. Используя этот подход, вы можете сосредоточиться на поиске подходящих решений и не заботиться об автоматически генерируемом программном коде.

Перейти на страницу:

Похожие книги