Урок 8. Универсальные методы. Решение, проект, сборка

Лабораторные работы си шарп и задания по теме «Язык программирования c sharp: универсальные методы; решение, проект, сборка»

Теория

Создание универсального метода

    При объявлении универсального метода вместо типа параметра указывается , означающее, что вместо него может быть любой тип данных, который будет определен при вызове функции и передаче ей параметра соответствующего типа.
  • Задание: поменять значениями две переменные. Переменные могут быть различного типа. Универсальный метод — это метод с параметрами любого типа. Определяется метод следующим образом:
  • static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp;
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }

    <T> означает любой тип данных.

  • Следующий пример демонстрирует один из способов вызова универсального метода с аргументами типа int:
  •     int a = 1;
        int b = 2;
     
        Swap<int>(ref a, ref b);
        System.Console.WriteLine($"{a}  {b}");
  • Или более простой способ вызова универсального метода:
  • Swap(ref a, ref b);

Решение, проект, сборка

  • В Visual Studio программа состоит из множества файлов, объединяющихся в проект (.csproj — проект).
  • В начале работы с программой создаётся решение (.sln – решение), включающее в себя один проект. Впоследствии к решению можно добавить несколько проектов.
  • Результатом компиляции проекта является сборка – откомпилированное приложение. В зависимости от его типа это .exe-файл (консольное приложение) или .dll-файл (библиотека классов).
  • Чтобы добавить новый класс в Visual Studio:

Задания и лабораторные си шарп

Лабораторная работа 1 (Lab 1). Создание универсального метода

Выполнить: Создайте универсальный метод PrintSymbol для вывода 10 раз введенного символа. Вызовите метод дважды: один раз с целочисленным параметром, второй раз — со строковым параметром.

Указание: Метод PrintSymbol должен принимать один аргумент — введенный символ (аргумент типа T (универсальный)); метод не должен возвращать значение (ключевое слово void).

Пример выполнения:

введите число:
2
результат:  2 2 2 2 2 2 2 2 2 2 
введите символ:
*
результат: * * * * * * * * * *

  
[Название проекта: Lesson_8Lab1, название файла L8Lab1.cs]

✍ Алгоритм:

  1. Выведите сообщение для пользователя с просьбой ввести символ. Сохраните ввод в целочисленном формате:
  2. ...
    Console.WriteLine("введите число");
    int symbolInt = Int32.Parse(Console.ReadLine());
    ...
    
  3. Для вывода символа создайте и объявите новый универсальный метод с названием PrintSymbol() (код метода должен быть до функции Main()). Для того, чтобы метод был универсальным используйте в качестве типа данных <T>:
  4. ...
    static void PrintSymbol <T>(T symbol)
    {
        ...
    }
    ...
    
  5. Разместите код для вывода символа. Используйте цикл for:
  6. ...
    for (int i=0; i < 10; i++)
                {
                    Console.Write($"{symbol} ");
                }
    ...
    
  7. Теперь можно вызвать созданный метод внутри функции Main. Введите следующий код в фигурных скобках метода Main():
  8. ...
    PrintSymbol(symbolInt);
    
  9. Используйте горячие клавишиCTRL+F5, чтобы запустить компиляцию без отладки.
  10. Теперь, вызовем тот же метод, но с аргументов строкового типа. Сначала, объявите переменную строкового типа и инициализируйте ее введенным пользователем значением:
  11.  ...
     Console.WriteLine("введите символ:");
     string symbolStr = Console.ReadLine();
     PrintSymbol(symbolStr);
    
  12. Запустите приложение и посмотрите на результат. Сохраните приложение.

Лабораторная работа 2. Добавление нового класса внутри одного пространства имен и одного проекта

Пояснение: С ростом сложности проекта становится необходимым добавление нового класса к проекту, и разработки методов этого класса. Класс может быть создан в том же самом cs-файле, после кода основного класса с методом Main. Вызов методов созданного класса можно выполнять внутри функции Main.
Выполнить: Добавьте новый класс MyFuncs в проект. Скопируйте код метода PrintSymbol и вставьте в код этого класса.

Пример выполнения:

введите число:
2
результат: 2 2 2 2 2 2 2 2 2 2 
введите символ:
*
результат: * * * * * * * * * *

[Название проекта: Lesson_8Lab2, название файла L8Lab2.cs]

✍ Алгоритм:

  • Откройте предыдущую лабораторную работу (Lesson_8Lab1). Скопируйте код метода PrintSymbol и вставьте его временно в какой-то текстовый файл (на всякий случай).
  • Создайте новое консольное приложение Lesson_8Lab2. Переименуйте файл program.cs в L8Lab2.cs.
  • Поместите курсор непосредственно после закрытой фигурной скобки класса L8Lab2 (на следующей строке).
  • Поместите код для создания нового класса MyFuncs:
  •  class L8Lab2
        {
            static void Main(string[] args)
            {
              ...
            }
        }
    // ваш код здесь
        class MyFuncs
        {
        }
    
  • Скопируйте код метода PrintSymbol (из временного текстового файла) и вставьте его в код для класса MyFuncs. К методу PrintSymbol кроме ключевого слова static, добавьте также ключевое слов publicчтобы сделать метод доступным во всех классах и пространствах имен:
  • ...
    class MyFuncs
        {
            public  static void PrintSymbol<T>(T symbol)
            {
                for (var i = 0; i < 10; i++)
                {
                    Console.Write($"{symbol} ");
                }
    
            }
        }
    
  • Попросите пользователя ввести символ (в функции Main):
  • ...
    Console.WriteLine("введите число");
    int symbolInt = Int32.Parse(Console.ReadLine());
    ...
    
  • Чтобы вызвать данный метод внутри функции Main необходимо обратиться к нему через класс MyFuncs:
  • ...
    MyFuncs.PrintSymbol(symbolInt); 
    ...
  • Запустите приложение, результат должен быть таким же, как и в предыдущей лабораторной работе.
  • Сохраните приложение и загрузите файл L8Lab2.cs в систему moodle.

Задание 1:

Выполнить: Создайте новый класс MyFuncs. В созданном классе создайте метод Add() для сложения двух чисел.

Указание: Метод Add() должен быть с двумя параметрами. Метод должен возвращать сумму этих двух параметров. Вызовите метод в функции Main. Заголовок метода должен быть следующим:

public static int Add(int i, int j)

  
Примерный результат:

введите два числа 
9  8
сумма: 17

  
    
[Название проекта: Lesson_8Task1, название файла L8Task1.cs


Лабораторная работа 3. Добавление нового класса (файла) в проект

Пояснение: С ростом сложности приложения становится необходимостью добавление нового класса для хранения там методов. Новый класс может быть добавлен как новый файл с новым пространством имен.

Выполнить: Откройте решение проекта (Lesson_8Lab2). Добавьте новый файл-класс MyFuncsLab3 к проекту. Скопируйте туда PrintSymbol() метод.

Пример выполнения:

введите число:
2
результат: 2 2 2 2 2 2 2 2 2 2 
введите символ:
*
результат: * * * * * * * * * *

[Название проекта: Lesson_8Lab2, название файла L8Lab3.cs and myFuncsLab3.cs]

✍ Алгоритм:

  • Откройте лабораторную работу (Lesson_8Lab2). Переименуйте основной файл в L8Lab3.
  • В окне Solution Explorer (Обозреватель решений) щелкните правой кнопкой на имени проекта -> Add (Добавить) -> Class (Класс). Назовите класс MyFuncsLab3.
  • В окне Обозреватель решений должен появиться файл MyFuncsLabs.cs.
  • Скопируйте туда метод PrintSymbol() ( в класс MyFuncsLab3 файла MyFuncsLab3.cs). Ключевое слово static больше не нужно, пригодится только public:
  • class MyFuncsLab3
        {
            public void PrintSymbol <T>(T symbol)
            {
                for (var i = 0; i < 10; i++)
                {
                    Console.Write($"{symbol} ");
                }
    
            }
        }
    
  • В окне Solution Explorer (Обозреватель решений) активируйте главный cs-файл — L8Lab3.cs, чтобы открыть код этого файла.
  • Чтобы вызвать методPrintSymbol, необходимо открыть функцию Main и добавить MyFunctsLab3 через точечную нотацию:
  • ...
    MyFunctsLab3.PrintSymbol(symbolInt);
    ...
  • Запустите приложение, результат должен быть такой же, как и в предыдущей лаб.раб.
  • Сохраните приложение и загрузите файлы L8Lab3.cs иMyFuncsLab3.cs в moodle.

Задание 2:

Выполнить: Дан массив целых чисел (10 элементов, сгенерированных случайно в диапазоне от -10 до10). Необходимо найти и вывести четные элементы массива, а также их индексы. Также вывести общее количество четных чисел. Все методы должны быть размещены в классе L8MyFunctions.

  
Указание 1: Добавьте новый класс L8MyFunctions (новый файл-класс).
Указание 2: Создайте метод FillRandomArray() для заполнения массива случайными числами.
Указание 3: Создайте метод Print для вывода элементов массива.
Указание 4: Создайте метод FindEven() для нахождения и вывода четных элементов массива. Метод должен принимать параметр arr (массив) и возвращать значение параметра counter (out параметр). Сигнатура функции должны быть следующей:

public void FindEven(int[] arr, out int counter)
  {
  }

     
Примерный результат:

Массив: 
9 8 -10 8 -1 6 2 -9 8 7 
четный элементы:
8, index: 1
-10, index: 2
8, index: 3
6, index: 5
2, index: 6
8, index: 8

количество четных: 6

[Название проекта: Lesson_8Task2, название файла L8Task2.cs, L8MyFunctions.cs]