ООП: инкапсуляция

Инкапсуляция — это управление окружением объекта, возможность дать доступ или ограничить его. Реализуется через модификаторы доступа private, public, protected, internal, protected internal.

Методы: перегрузка

Если для разных типов данных или при разном количестве передаваемых аргументов нужно запускать разные методы, то имеется возможность перегрузки методов.

static void Print(int a) {
  Console.WriteLine("Value: " + a);
  }
static void Print(double a) {
  Console.WriteLine("Value: " + a);
  }
static void Print(string label, int a) {
  Console.WriteLine(label + a);
  }

static void Main(string[] args) {
  Print(11);
  Print(4.13);
  Print("Ответ: ", 14);
  }

Перегрузка работает только при разных типах аргументов. Следующий код выведет ошибку:

int Print(int a) {}
float Print(int a) {}
double Print(int a) {}

Методы: передача аргумента по ссылке

В C# по умолчанию в методы аргументы передаются по значению (т.е. информация из вне копируется внутрь метода). Если есть необходимость передать аргумент по ссылке, чтобы после применения метода значение передаваемого аргумента менялось не только внутри метода, но и за его пределами, есть специальное слово ref. В коде это выглядит так:

static void Sqr(ref int x) {
  x = x * x;
  }

static void Main() {
  int a = 3;
  Sqr(ref a);

  Console.WriteLine(a);
  }

// будет выведено 9

При использовании ref переменной должно быть присвоено значение до инициализации метода.

Если нужно без присвоения до инициализации, используем out.

Динамическая типизация в C#

Если заранее неизвестно к какому типу будет принадлежать переменная, в C# есть выход — ключевое слово var.

var num = 15; // сделает num integer
var num = "dabba"; // сделает num string

var num;
num = 15; // выведет ошибку, при использовании var надо сразу присваивать переменной значение

Краткий условный оператор

В C# наряду с обычным условным оператором if есть краткий условный оператор. Выглядит так:

int y = 5;
string msg;
msg = (y >= 5) ? "Больше или равно" : "Меньше";
Console.WriteLine(msg);

// Будет выведено "Больше или равно"
// Код "msg = (y >= 5) ? "Больше или равно" : "Меньше";" равнозначен конструкции:

if (y >= 5) {
   msg = "Больше или равно";
   }
else {
   msg = "Меньше";
   }