Реализация (С# 2). Строго типизированные коллекции
Работа с обобщениями (список с указанием типа элементов); закрытые методы установки значений (которые потом используются в конструкторе). Таким образом исправлены два главных недостатка кода C#1.
using System.Collections.Generic;
class Product
{
string name;
public string Name
{
get { return name; }
private set { name = value; }
}
decimal price;
public decimal Price
{
get { return price; }
private set { price = value; }
}
public Product(string name, decimal price)
{
Name = name;
Price = price;
}
public static List<Product> GetSampleProducts()
{
List<Product> list = new List <Product>();
list.Add(new Product("West Side Story", 9.99m));
list.Add(new Product("Assasins", 14.99m));
list.Add(new Product("Frogs", 13.99m));
list.Add(new Product("Sweeney Todd", 10.99m));
return list;
}
public override string ToString()
{
return string.Format("{0}:{1}", name, price ); ;
}
}
static void Main(string[] args)
{
List<Product>list = Product.GetSampleProducts();
foreach (Product product in list)
Console.WriteLine(product.ToString());
Console.Read();
}
Код по прежнему достаточно тяжеловесен.
Реализация (С# 3). Автоматически реализуемые свойства
Представлены автоматически реализуемые свойства и упрощенная инициализация. У свойств теперь нет никакого кода, нет видимых переменных. Использование только свойств улучшает целостность класса.
Закрытый конструктор без параметров обеспечивает инициализацию на основе свойств.
class Product
{
public string Name
{
get;
private set;
}
public decimal Price
{
get;
private set;
}
public Product(string name, decimal price) // вообще говоря от него //можно отказаться
{
Name = name;
Price = price;
}
Product() { } //обеспечивает инициализацию на основе свойств
public static List<Product> GetSampleProducts()
{
return new List<Product>{
new Product {Name = "West Side Story", Price = 9.99m},
new Product {Name = "Assasins", Price = 14.99m},
new Product {Name = "Frogs1", Price = 13.99m},
new Product {Name = "Sweeney Todd",Price= 10.99m}
};
}
public override string ToString()
{
return string.Format("{0}:{1}", Name, Price ); ;
}
}
Реализация (С# 4). Именованные аргументы
За базовую возьмем версию C#1 (для свойств и конструкторов). Более однозначно указывается, у что разрабатываемого типа данных поля могут быть изменены только внутренне (readonly).
class Product
{
readonly string name;
public string Name { get { return name; } }
readonly decimal price;
public decimal Price { get { return price; } }
public Product(string name, decimal price)
{
this.name = name;
this.price = price;
}
public static List<Product> GetSampleProducts()
{
return new List<Product>{
new Product (name: "West Side Story", price: 9.99m),
new Product (name: "Assasins", price: 14.99m),
new Product (name: "Frogs1", price: 13.99m),
new Product (name: "Sweeney Todd",price: 10.99m)
};
}
Эволюция:
Свойства только для чтения; слабо типизированные коллекции
Закрытые методы установки значения свойств; строго типизированные коллекции
Автоматически реализуемые свойства; улучшенная инициализация коллекций и объектов