using System;
using System.Collections;
using System.Collections.Generic; // обобщенные коллекции
/*
* Обобщения(Generics)
*/
///
/// Обобщения(Generics) - это такие конструкции языка которые позволяют
/// писать код который будет одинаково работать с различными типами данных
/// общий код для разных типов данных, при этом мы сохраняем строгую типизацию языка
/// получаем несколько еще очень полезных и нужных бонусов
///
/// Например:
/// позволяет избежать процесса упаковки и распаковки значимых типов, что увеличивает производительность кода
///
class Program
{
static void Main()
{
int a = 1, b = 5;
string c = "aa", d = "bb";
Console.WriteLine($"a = {a}, b = {b}");
Console.WriteLine($"str_d = {d}, str_c = {c}");
Swap(ref a, ref b);
SwapType(ref c, ref d);
Console.WriteLine($"a = {a}, b = {b}");
Console.WriteLine($"str_d = {d}, str_c = {c}");
// List также использует обобщения
var list = new List();
list.Add(2);
list.Add(5);
Console.WriteLine($"el[1] list: {list[0]}");
list[0] = 1;
Console.WriteLine($"Change el[1] list: {list[0]}");
// ArrayList - аналог
// но проблемы с упаковкой распаковкой так как это тип данных object
// *почти не используется
ArrayList arrayList = new ArrayList();
arrayList.Add(2);
arrayList.Add("33");
Console.WriteLine($"el[1] arrayList: {arrayList[0]}");
arrayList[0] = 1;
Console.WriteLine($"Change el[1] arrayList: {arrayList[0]}");
// Свой List
var listString = new MyList();
listString.Add("aaa");
listString.Add("bbb");
Console.WriteLine($"1: {listString[0]} 2: {listString[1]}");
Console.ReadKey();
}
static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void SwapType(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
static T Foo()
{
return default(T);
}
}