Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
opi.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.81 Mб
Скачать

Анонімні типи.

Поєднуючи ініціалізатори об'єктів і виведення типів, можна створювати прості об'єкти сховища даних без необхідності визначення відповідного класу або структури. Приклад наведено в лістингу 9.

Лістинг 9. Створення анонімного типу

var myAnonType = new (

Name = "MVC",

Category = "Pattern"

};

Console.WriteLine ("Name: {0}, Type: {1}",

myAnonType.Name, myAnonType.Category);

У цьому прикладі myAnonType – анонімно типізований об'єкт. Це не означає, що він є динамічним e тому сенсі, в якому динамічно типізовані змінні JavaScript. Просто визначення типу буде автоматично створюватися компілятором. Строга типізація, як і раніше, залишається в силі. Наприклад, можна отримувати і встановлювати тільки ті властивості, які визначені у ініціалізаторі.

Компілятор C# генерує клас на основі імені і типу параметрів у ініціалізаторі. Два анонімно типізованих об'єкти, які мають однакові імена і типи властивостей, будуть призначені до одного й того ж автоматично згенерованого класу. Це означає, що можна створювати масиви анонімно типізованих об'єктів, як показано в лістингу 10.

Лістинг 10. Створення масиву анонімно типізованих об'єктів

using System;

class Program {

static void Main(string[] args) {

var oddsAndEnds = new[] {

new { Name = "MVC", Category = "Pattern"},

new { Name = "Hat", Category = "Clothing"},

new { Name = "Apple", Category = "Fruit"}

};

foreach (var item in oddsAndEnds) {

Console.WriteLine("Name: {0}", item.Name);

}

}

}

Потрібно звернути увагу на те, що для оголошення масиву змінних використано ключове слово var . Це обов'язково, оскільки ми не володіємо типом, який можна було б вказати, як мало б місце у випадку зі звичайним типізованим масивом. Навіть притому, що ми не визначили клас ні для одного з цих об'єктів, все ж можна перерахувати вміст масиву і виконати читання значення властивості Name з кожного з них. Це важливо, оскільки без цієї функціональної можливості взагалі не можна було б створювати масиви анонімно типізованих об'єктів. Або, вірніше, ми змогли б створювати масиви, але не змогли б виконувати над ними ніяких корисних дій.

Використання методів розширення Методи розширення

Методи розширення – це зручний спосіб додавання методів в класи, власником яких ви не є і, отже, не можете змінювати їх безпосередньо. У лістингу 1 міститься код класу ShoppingCart, що представляє колекцію об'єктів Products.

Лістинг 1. Клас ShoppingCart

using System.Collections.Generic;

public class ShoppingCart {

public List<Product> Products { get; set; }

}

ShoppingCart – це простий клас, який діє як оболонка колекції List об'єктів Product (для цього прикладу необхідний тільки базовий клас). Припустимо, що нам потрібно мати можливість визначення загальної вартості об'єктів Product в класі ShoppingCart, але ми не можемо змінювати сам клас, можливо тому, що він поступає звідкись ззовні, і ми не володіємо його вихідним кодом. У такому випадку для отримання необхідної функціональності можна використовувати метод розширення, як показано в лістингу 2.

Лістинг 2. Визначення методу розширення

public static class MyExtensionMethods {

public static decimal TotalPrices (this ShoppingCart cartParam) {

decimal total = 0;

foreach (Product prod in cartParam.Products) {

total + = prod.Price;

}

return total;

}

}

Ключове слово this, розташоване перед першим параметром, позначає TotalPrices як метод розширення. Перший параметр вказує .NET, до якого класу може застосовуватися метод розширення – в даному випадку до ShoppingCart. На екземпляр ShoppingCart, до якого застосовано метод розширення, можна посилатися за допомогою параметра cartParam. Наш метод виконує перерахування допомогою Products в ShoppingCart і повертає суму властивості Product.Price. Застосування методу розширення продемонстровано в лістингу 3.

Лістинг 3. Застосування методу розширення

using System;

using System.Collections.Generic;

class Program {

static void Main(string[] args) {

Product[] productArray = {

new Product {Name = "Kayak", Price = 275M},

new Product {Name = "Lifejacket", Price = 48.95M},

new Product {Name = "Soccer ball", Price = 19.50M},

new Product {Name = "Corner flag", Price = 34.95M}

};

decimal cartTotal = cart.TotalPrices ();

Console.WriteLine("Total: {0: c} ", cartTotal);

}

}

Код в лістингу створює колекцію ShoppingCart і заповнює її об'єктами Product, використовуючи засіб ініціалізатора об'єкта. Оператор, який застосовує метод розширення, виділений напівжирним. Як бачите, ми просто викликаємо метод, неначе він є частиною класу ShoppingCart. Зверніть також увагу, що метод розширення не був визначений у тому ж самому класі, в якому ми його використали. Середовище .NET знайде класи розширення, якщо вони знаходяться в області дії поточного класу – тобто є частиною того ж самого простору імен або простору імен, який зазначено в операторі using. Виведення класу, наведеного в лістингу 3, має наступний вигляд:

Total: $ 378.40

На замітку! Методи розширення НЕ дозволяють порушувати правила доступу, які задані класами для своїх методів, полів і властивостей. Функціональність класу можна розширити за допомогою методу розширення, але з використанням тільки тих членів, до яких у будь-якому випадку є доступ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]