
- •Основы c#. Урок 1. Что такое c#?
- •Основы c#. Урок 2. Что такое net Runtime?
- •Основы c#. Урок 3. Первая программа на c#
- •Основы c#. Урок 4. Переменные языка c#
- •Основы c#. Урок 5. Логические операторы
- •Основы c#. Урок 6. Массивы в c#
- •Основы c#. Урок 7. Операторы if и switch
- •Основы c#. Урок 8. Циклы for и foreach
- •Основы c#. Урок 9. Цикл while
- •Основы c#. Урок 10. Классы в c#
- •Основы c#. Урок 11. Конструкторы классов
- •Основы c#. Урок 12. Наследование
- •Основы c#. Урок 13. Запись в экземпляр базового класса экземпляра производного
- •Основы c#. Урок 14. Вложенные классы
- •Основы c#. Урок 15. Перегрузка бинарных операторов
- •Основы c#. Урок 16. Перегрузка унарных операторов
- •Основы c#. Урок 17. Область видимости
- •Основы c#. Урок 18. Виртуальные функции
- •Основы c#. Урок 19. Абстрактные классы
- •Основы c#. Урок 20. Запрещение наследования или модификатор sealed
- •Основы c#. Урок 21. Статические переменные
- •Основы c#. Урок 22. Статические методы класса
- •Основы c#. Урок 23. Статические конструкторы
- •Основы c#. Урок 24. Закрытые конструкторы или классы без экземпляров
- •Основы c#. Урок 25. Передача параметров переменой длины
- •Основы c#. Урок 26. Строки (класс System.String)
- •Основы c#. Урок 27. Строки (класс StringBuilder)
- •Основы c#. Урок 28. Передача параметров по ссылке и по значению (ref и out)
- •Основы c#. Урок 29. Пример передачи по ссылке
- •Основы c#. Урок 30. Перегрузка
- •Основы c#. Урок 31. Функции класса System.Array
- •Основы c#. Урок 32. Делегаты
- •Основы c#. Урок 33. События
- •Основы c#. Урок 34. Пример класса с событием
- •Основы c#. Урок 35. Введение в атрибуты
- •Основы c#. Урок 36. Пример пользовательского атрибута
- •Основы c#. Урок 37. Параметры командной строки
- •Основы c#. Урок 38. Метод Main в отдельном классе
- •Основы c#. Урок 39. Форматированный вывод
- •Основы c#. Урок 40. Класс System.Object
- •Основы c#. Урок 41. Методы класса System.Object
- •Основы c#. Урок 42. Переопределяем методы класса System.Object
- •Основы c#. Урок 43. Константы
- •Основы c#. Урок 44. Модификаторы доступа
- •Основы c#. Урок 45. Ссылка на текущий экземпляр класса (this)
- •Основы c#. Урок 46. Класс Environment
- •Основы c#. Урок 47. Работаем со специальными папками
- •Основы c#. Урок 48. Получаем список всех дисков
- •Основы c#. Урок 49. Ввод/вывод в c# (System.Io)
- •Основы c#. Урок 50. Классы для работы с папками и файлами
- •Основы c#. Урок 51. Класс Directory
- •Основы c#. Урок 52. Класс File
- •Основы c#. Урок 53. Класс FileSystemInfo
- •Основы c#. Урок 54. Класс DirectoryInfo
- •Основы c#. Урок 55. Перечисление FileAttributes
- •Основы c#. Урок 56. Класс FileInfo
- •Основы c#. Урок 57. Пример: получение имен всех подпапок
- •Основы c#. Урок 58. Класс Path
- •Основы c#. Урок 59. Класс FileSystemWatcher
- •Основы c#. Урок 60. Перечисление NotifyFilters
- •Основы c#. Урок 61. Перечисление WatcherChangeTypes
- •Основы c#. Урок 62. Класс FileSystemWatcher - пример использования
- •Основы c#. Урок 63. Сериализация класса
- •Основы c#. Урок 64. Класс BitArray
- •Основы c#. Урок 65. Класс Stack
- •Основы c#. Урок 66. Класс SortedList
- •Основы c#. Урок 67. Конвертация типов через класс Convert
- •Основы c#. Урок 68. Работа с перечислениями (enum)
- •Основы c#. Урок 69. Использование атрибута Flags для перечисления
- •Основы c#. Урок 70. Использование атрибута Flags для перечисления 2
- •Основы c#. Урок 71. Nullable типы
- •Основы c#. Урок 72. Reflection - динамическое создание кода
- •Основы c#. Урок 73. Reflection - создание enum'ов
Основы c#. Урок 31. Функции класса System.Array
Массивы в C# основаны на классе System.Array. У этог класса, как и у любого другого, есть разные полезные методы.
Вот пример:
using System;
namespace test
{
class Test
{
static void Main(string[] args)
{
//Объявление массива.
int [] num = {4, -5, 2, 0, 23};
//Выводим массив.
foreach (int i in num)
{
Console.WriteLine(i.ToString());
}
//Переворачиваем массив.
Console.WriteLine("Перевернутый массив");
Array.Reverse(num);
foreach (int i in num)
{
Console.WriteLine(i.ToString());
}
//Сортируем массив.
Array.Sort(num);
Console.WriteLine("Отсортированный массив");
foreach (int i in num)
{
Console.WriteLine(i.ToString());
}
//Обнуляем массив.
Array.Clear(num, 0, 5);
Console.WriteLine("Обнуленный массив");
foreach (int i in num)
{
Console.WriteLine(i.ToString());
}
}
}
}
Тут мы используем статические методы класса Array для сортировки, переворачивания и очистки массива. Разумеется, эти методы не единственные.
В классе Array есть, например, еще встроенный статический метод IndexOf предназначенный для поиска элемента в массиве. Вот пример его использования:
...
int k=-5;
Console.WriteLine("Число {0} находится на {1} месте.", k, Array.IndexOf(num, k));
...
Этот метод возвращает индекс искомого элемента (нумерация с нуля). Если такого элемента нет, то возвращается -1.
Обратите внимание, что эти методы действуют для встроенных типов (в нашем примере массив был типа int). Для пользовательских типов данных их применение тоже возможно, но для этого на приложить некоторые дополнительные усилия.
Как видите, с массивами в C# можно автоматически делать много чего полезного. В Visual C++, например, такого удобства не было.
Основы c#. Урок 32. Делегаты
Сначала пара слов о том, что такое делегаты. В языке программирования могут быть переменные, содержащие значения целого или вещественного типов. С такими типами все вы хорошо знакомы. Так вот, в первом приближении делегаты - это тоже некоторый тип данных. Что же за тип может хранится в делегатах? В делегатах могут хранится функции (вернее указатели на функции). Т. е. переменной типа делегат можно сначала присвоить одну функцию, поработать с ней, а затем присвоить другую функцию. Это все в первом приближении. Теперь несколько подробностей. Во-первых, делегаты бывают разных типов. Тип делегата определяется типов и количеством параметров и типом возвращаемого значения. Это значит, что если, например, делегат типа void и у него только один параметр типа int, то в такой делегат мы можем записать только функцию типа void и с одним единственным параметром типа int. Во-вторых, делегаты, в отличие от указателей на функции языка C++, представляют из себя безопасные типы данных.
Вот пример делегата:
using System;
namespace test
{
//Объявление делегата.
delegate float MyFunc(float x);
//Класс для тестирования делегата.
class Test
{
//Первая функция.
static float f1(float x)
{
return x;
}
//Вторая функция.
static float f2(float x)
{
return x*x;
}
//Третья функция.
static float f3(float x)
{
return (float)Math.Sqrt(x);
}
//Метод Main.
static void Main()
{
//Создаем экземпляр делегата.
MyFunc f = new MyFunc(f1);
int a; //Ответ пользователя.
Console.WriteLine("Выберите функцию:\n1.f1=x.\n2.f2=x*x.\n3.f3=sqrt(x).");
//Преобразуем ответ пользователя к типу Int32
a=Int32.Parse(Console.ReadLine());
switch(a)
{
case 1:
//Записываем в делегат 1-ю функцию.
f=new MyFunc(f1);
break;
case 2:
//Записываем в делегат 2-ю функцию.
f=new MyFunc(f2);
break;
case 3:
//Записываем в делегат 3-ю функцию.
f=new MyFunc(f3);
break;
}
//Печатаем результат.
int x=4;
Console.WriteLine("f({0})={1}", x, f(x));
}
}
}
В этой программе мы сначала объявляем делегат:
...
delegate float MyFunc(float x);
...
Синтаксис объявления делегата такой - сначала пишем ключевое слово delegate, затем - тип возвращаемого значения (float в нашем примере), потом - произвольное имя делегата (у нас это MyFunc), после которого в круглых скобках перечисляем параметры (у нас только один параметр типа float). Объявленный делегат появится на вкладке ClassView (со специальным значком для делегатов):
Далее мы в нашем тестовом классе объявляем несколько методов - f1, f2 и f3. Все эти методы имеют тип float и один параметр типа float (как и у делегата MyFunc). Функции делают свой подсчет по-разному - первая просто возвращает параметр, вторая - квадрат параметра, третья - корень из параметра.
Далее мы в методе Main создаем экземпляр нашего делегата и в зависимости от ответа пользователя записываем в него f1, f2 или f3. Потом в строке
...
Console.WriteLine("f({0})={1}", x, f(x));
...
мы выводим значение делегата при некотором x (равном 4 в нашем примере). Вернее сказать, мы выводим не значение делегата, а значение функции, которую мы записали в делегат.
В зависимости от ответа пользователя в делегат запишется тот или иной вариант функции и программа выведет сам x (4), x умножить на x (16) или корень из x (2):