
- •1)Принципы ооп (инкапсуляция, наследование, полиморфизм)
- •Формы полиморфизма Edit
- •2)Структура программы на с#
- •3)Встроенные типы данных. Типы-значения и ссылочные типы, упаковка и распаковка
- •4)Переменные и их инициализация, область видимости и время жизни переменных Проект Variables
- •Синтаксис объявления
- •Время жизни и область видимости переменных
- •Глобальные переменные уровня модуля.
- •Константы
- •5)Арифметические операторы, логические операторы
- •6)Приоритет операций, преобразование типов в выражениях
- •7)Оператор присваивания
- •Составные операторы присваивания
- •8)Операторы условный и выбора
- •Оператор if
- •Оператор switch
- •9)Операторы цикла
- •Цикл for
- •Цикл while
- •Цикл do. . . While
- •Цикл foreach
- •10)Операторы перехода
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •11)Массивы, создание и инициализация массивов, ступенчатые массивы
- •Инициализация массива
- •Неявно типизированные массивы
- •Определение массива объектов
- •Свойство Length
- •Двумерные массивы
- •Массивы трех и более измерений
- •Инициализация многомерных массивов
- •Применение свойства Length при обращении со ступенчатыми массивами
- •12)Классы и объекты, элементы класса
- •Общая форма определения класса
- •Данные-члены
- •Функции-члены
- •Переменные ссылочного типа и присваивание
- •Инициализаторы объектов
- •Методы, статические методы, параметры методов
- •Объявление методов
- •Возврат из метода и возврат значения
- •Использование параметров
- •14)Перегрузка методов
- •15)Конструкторы
- •16)Сборка мусора и деструкторы
- •Деструкторы
- •17)Перегрузки операторов
- •Перегрузка бинарных операторов
- •Перегрузка унарных операторов
- •Выполнение операций со встроенными в с# типами данных
- •Перегрузка операторов отношения и операторов true - false
- •Перегрузка операторов отношения
- •Перегрузка операторов true и false
- •Перегрузка логических операторов
- •Перегрузка укороченных логических операторов
- •Свойства
- •Автоматически реализуемые свойства
- •19)Индексаторы
- •Одномерные индексаторы
- •Многомерные индексаторы
- •20)Основы наследования
- •21)Конструкторы и наследование
- •23)Виртуальные методы
Использование параметров
При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром. Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные.
В общем случае параметры могут передаваться методу либо по значению, либо по ссылке. Когда переменная передается по ссылке, вызываемый метод получает саму переменную, поэтому любые изменения, которым она подвергнется внутри метода, останутся в силе после его завершения. Но если переменная передается по значению, вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней по завершении метода будут утеряны. Для сложных типов данных передача по ссылке более эффективна из-за большого объема данных, который приходится копировать при передаче по значению.
Давайте рассмотрим пример:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class myClass
{
public void someMethod(double[] myArr, int i )
{
myArr[0] = 12.0;
i = 12;
}
}
class Program
{
static void Main(string[] args)
{
double[] arr1 = { 0, 1.5, 3.9, 5.1 };
int i = 0;
Console.WriteLine("Массив arr1 до вызова метода: ");
foreach (double d in arr1)
Console.Write("{0}\t",d);
Console.WriteLine("\nПеременная i = {0}\n",i);
Console.WriteLine("Вызов метода someMethod ...");
myClass ss = new myClass();
ss.someMethod(arr1,i);
Console.WriteLine("Массив arr1 после вызова метода:");
foreach (double d in arr1)
Console.Write("{0}\t",d);
Console.WriteLine("\nПеременная i = {0}\n",i);
Console.ReadLine();
}
}
}
Обратите внимание, что значение i осталось неизменным, но измененные значения в myArr также изменились в исходном массиве arr1, так как массивы являются ссылочными типами.
Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.
Статическим называется метод, который существует в классе как таковом, а не в отдельных его экземплярах. Как и в случае других статических членов, главное преимущество статических методов в том, что они расположены вне конкретных экземпляров класса и не засоряют глобальное пространство приложения. При этом они и не нарушают принципов ООП, поскольку ассоциированы с определенным классом. Примером может служить API баз данных, представленный ниже. В той иерархии классов есть класс SQLServerDb. Помимо базовых операций для работы с БД (new, update, read и delete), класс содержит метод, предназначенный для восстановления БД. В методе Repair не нужно открывать саму БД. Следует использовать функцию ODBC SQLConfigDataSource, которая предполагает, что БД закрыта. Однако конструктор SQLServerDb открыл БД, указанную переданным ему именем. Поэтому здесь очень удобно использовать статический метод. Это позволит поместить метод в класс SQLServerDb, к которому он принадлежит, и даже не обращаться к конструктору класса. Очевидно, выгода клиента в том, что он также не должен создавать экземпляр класса SQLServerDb. В следующем примере вы можете видеть вызов статического метода (RepairDatabase) из метода Main. Заметьте, что для этого не создается экземпляр SQLServerDB:
using System; class SQLServerDb { public static void RepairDatabase() { Console.WriteLine("восстановление базы данных..."); } } class StaticMethodlApp { public static void Main() { SQLServerDb.RepairDatabase(); } }
Определить метод как статический позволяет ключевое слово static. Затем для вызова метода пользователь применяет синтаксис вида Класс.Метод. Этот синтаксис необходим, даже если у пользователя есть ссылка на экземпляр класса. Данный момент можно проиллюстрировать кодом, который не будет компилироваться:
using System; class SQLServerDb { public static void RepairDatabase() { Console.WriteLine("восстановление базы данкых..."); } } class StacicMethod2App { public static void Main() { SQLServerDb db = new SQLServerDb(); db.RepairDatabase(); } }
Последним моментом, касающимся статических методов, является правило, определяющее, к каким членам класса можно обращаться из статического метода. Как вы можете догадаться, статический метод может обращаться к любому статическому члену в пределах класса, но не может обращаться к члену экземпляра. Например:
using System; class SQLServerDb { static string progressStringl = "repairing database..."; string progressString2 = "repairing database..."; public static void RepairDatabase() { Console.WriteLine(progressStringl); /* compiled normally */ Console.WriteLine(progressString2); /* error on compilation */ } } /* compilation */ class StaticMethod3App { public static void Main() { SQLServerDb.RepairDatabase(); } }
Компилятор не пропустит этот код, потому что он содержит ошибку. Статический метод пытается обратиться к нестатической переменной класса. Это недопустимо в С#.