Добавление бизнес-логики в сгенерированный код

Оценить
(0 голоса)

Частичный метод (подобно частичному классу) представляет собой код, который вы пишете для добавления в качестве специфического метода в данный класс при компиляции. Это позволяет автору частичного класса определить заглушку метода, а затем вызывать этот метод из других мест класса. Если вы предоставляете код реализации для заглушки частич­ного метода, то ваш код вызывается при вызове заглушки (фактически компилятор объеди­няет ваш код и частичный класс в единый класс). Если вы не предоставляете определения частичного метода, то компилятор делает еще один шаг ,и удаляет метод из класса (вместе со всеми его вызовами).

Частичный метод (и частичный класс) был создан для того, чтобы помогать в генерирова­нии кода, и его использования в общем случае следует избегать (если только вы не пишете генераторы кода или не работаете с ним), поскольку частичные методы могут вызвать в ва­шем коде путаницу.

Конечно, в Visual Studio появляется все больше и больше встроенных генераторов кода. По­этому рано или поздно вы столкнетесь с частичными методами. В большинстве случаев ге­нератор кода или визуальный конструктор (такой как LINQ to SQL) генерирует частичный класс и (возможно) один или несколько частичных методов. Модификатор Partial опреде­ляет как частичные классы, так и частичные методы. Если вы работаете со сгенерирован­ным кодом, то часто будете получать частичный класс, который позволит создать вашу соб­ственную часть класса (для объединения со сгенерированной частью во время компиляции). Таким образом, вы можете добавить собственную бизнес-логику в любой частичный метод, определенный и вызываемый в сгенерированном коде.

Рассмотрим пример. Далее представлен экземпляр частичного класса Employee. Здесь имеет­ся единственное свойство Salary. Кроме того, есть метод (помеченный Partial) SalaryChanged. Этот метод вызывается тогда, когда изменяется величина свойства Salary.

□    VB:

Partial Class Employee

Private __salary As Double Property Salary() As Double Get

Return _salary End Get

Set(ByVal value As Double)

_salary = value SalaryChanged()

End Set End Property

Partial Private Sub SalaryChanged()

End Sub

End Class

□    С#:

partial class Employee { double _salary;

public double Salary { get {

return _salary;

}

set {

_salary = value;

SalaryChanged();

}

}

partial void SalaryChanged();

}

Предыдущий код мог бы быть кодом, созданным генератором кода. Следующая задача в реализации частичного метода — это создание другого частичного класса Employee и пре­доставление реализации метода SalaryChanged. Это делает следующий код:

□    VB:

Partial Class Employee

Private Sub SalaryChanged()

Dim newSalary As Double = Me.Salary

' Делаем что-нибудь с информацией о заработной плате...

End Sub End Class

□    С#:

partial class Employee {

partial void SalaryChanged() { double newSalary = this.Salary;

// Делаем что-нибудь с информацией о заработной плате ...

}

}

Компилятор заменяет метод SalaryChanged новым частичным методом. Таким образом, исходный частичный класс (возможно, сгенерированный) рассчитывал на метод, который мог быть где-то написан, причем не зная ничего об этом методе. Если вы примете решение написать его, тогда он будет вызван в надлежащее время. Однако это необязательно. Если вы не предоставите реализацию частичного метода SalaryChanged, то компилятор ликви­дирует и сам метод, и его вызовы — как будто они никогда и не существовали.

Доступ к данным и выполнение запросов при помощи .NET-языков

Ббльшая часть особенностей Visual Studio 2008 с точки зрения языков относится к новой функциональной возможности LINQ (Language-Integrated Query, встроенный язык запро­сов). LINQ— это новая модель программирования, которая использует многие уже обсуж­давшиеся функции. Она предоставляет расширения языков, которые должны изменить спо­соб, используемый вами для доступа к данным и работы с ними. С ее помощью вы можете работать с вашими данными с использованием объектного синтаксиса и делать запросы к коллекциям объектов при помощи VB и С#.

Вы можете использовать LINQ для установления соответствия между таблицами и объекта­ми (см. главу 18). Таким образом, вы получаете более простой и производительный способ работы с вашими данными. Сюда входит также полная поддержка технологии IntelliSense (по названиям таблиц и столбцов), а также поддержка управления вставками, обновлениями, удалениями и чтением.

Последнее — чтение данных — составляет важную часть LINQ в том смысле, что оно имеет встроенную поддержку запросов к коллекциям данных. При помощи функциональных воз­можностей LINQ вы можете делать запросы не только к вашим данным, но и к любой кол­лекции в .NET. Безусловно, имеются для этого и новые ключевые слова, и синтаксис. В со­ставе Visual Basic имеются операторы Select, From, Where, Join, Order By, Group By, Skip, Take, Aggregate, Let и Distinct. Язык C# имеет похожий набор ключевых слов. И если этого недостаточно, то вы можете расширить встроенные операторы запросов, заме­нить их или написать собственные.

Вы используете эти операторы запросов для выполнения запросов к любым данным .NET, реализующим интерфейс IEnumerable или IQueryable. Это может быть DataTable, объ­екты SQL Server, коллекции .NET (в том числе Generics, DataSets и данные XML).

Рассмотрим пример. Предположим, что у вас была коллекция объектов служащих employees, и вы хотели получить доступ ко всем служащим в определенном месте. Для этого вы можете написать следующую функцию:

□    С#:

public static List<Employee> FilterEmployeesByLocation(

List<Employee> employees, string location) {

// Запрос LINQ для получения коллекции служащих, отфильтрованной по месту var emps = from Employee in employees where Employee.Location.City == location select Employee;

return emps.ToList();

}

□    VB:

Public Function FilterEmployeesByLocation( _

ByVal employees As List(Of Employee), _

ByVal location As String) As List(Of Employee)

' Запрос LINQ для получения коллекции служащих,

' отфильтрованной по месту

Dim emps = From Employee In employees _

Where Employee.Location.City = location

Return emps.ToList()

End Function

/

Взгляните на то, что происходит в предыдущем фрагменте кода. Функция принимает список объектов служащих, фильтрует его по переданному в нее региону, а затем возвращает ре­зультирующий список. Обратите внимание, что для фильтрации списка мы создаем в опера­тивной памяти LINQ-запрос emps. Этот запрос можно читать так: рассматривая всех слу­жащих коллекции employees, необходимо отыскать тех, чей город совпадает с городом, переданным в функцию. Наконец, вызов метода emps.ToList () в операторе возврата пре­образует результаты запроса в памяти в новую коллекцию.

Это только краткий обзор LINQ. В нем есть еще много всего, в том числе и проверка во время компиляции, и проверка правильности схемы, не говоря уже о новом синтаксисе LINQ. Вы, несомненно, захотите посвятить LINQ побольше времени в самом ближайшем будущем.

Разбиение сборки на несколько файлов
Работа с XML непосредственно в коде
Удаление неиспользуемых аргументов из обработчиков событий (только для VB)
Улучшения в .NET Framework 3.5
Резюме

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


Защитный код
Обновить

© 2017 www.visualstudios.ru. Все права защищены.