This repository has been archived on 2024-08-23. You can view files and clone it, but cannot push or open issues or pull requests.
lessons/C#/C#.md
2023-09-24 09:01:39 +00:00

6.2 KiB
Raw Blame History

C#

Project file

Project file - файл для конфигурации проекта в формате xml

Поля:

  • OutputType (Exe | Dll) - во что компилировать
  • TargetFramework (net7.0) - версия .NET

Переменные

string name = "Tom";
string name2;
name2 = "Bob";

Константы

const string NAME = "Tom";

Типы данных

  • bool
  • sbyte (signed byte)
  • byte
  • short - 16 байт
  • ushort (unsigned)
  • int - 32 байта
  • uint
  • long - 64 байта
  • ulong
  • char - 16 байт. Знак unicode
  • float 32 байт
  • double - 64 байта
  • decimal - 128 бит
  • string
  • object - аля Python Object

Числа в формате 3.14 по умолчанию double. Если нужен float или decimal, то используются суффиксы

float a = 3.14f;
decimal b = 3.14m;

Для целочисленных по умолчанию int

int a = 5;
uint b = 5u;
long c = 5l;
ulong d = 5ul;

Неявная типизация

var hello = "Hello world";

Для var объявление и инициализация должны идти вместе

// Так низя: ошибка
var c;
c = 5;

Вывод в терминал

Console.WriteLine("Привет");
Console.Write("Привет ");
Console.Write("Мир");

Выведет:

Привет
Привет мир

Форматированный вывод

string name = "John";
string age = 34;
Console.WriteLine($"{name} is {age} years old")

Ввод данных

string? name = Console.ReadLine();
int foo = Convert.ToInt32(Console.ReadLine());

Простые операторы

  • +
  • -
  • *
  • /
  • %

Преобразование базовых типов данных

Операция сложения и вычитания возвращает int, если типы, на которые применяется операция, <= int (byte, short, int)

Неявное преобразование

Работает только на расширение

byte a = 4;
ushort = a;

Явное преобразовывание

Работает на расширение и на сужение

byte a = 5;
byte b = 4;
byte c = (byte) (a+b);

Ветвление

int a = 5;

if (a == 5) {
    Console.WriteLine("It works");
} else {
    Console.WriteLine("Cosmic ray!");
}

Тернарный оператор

Краткая возвращающая форма if

int x = 3;
int y = 5;

string z = x < y ? "Works" : "Cosmic ray";

Switch

int number = 1;

switch (number) {
    case 1:
        Console.WriteLine("case 1");
        goto case 5;
    case 3:
        Console.WriteLine("case 3");
        break;
    case 5:
        Console.WriteLine("case 5");
        break;
    default:
        Console.WriteLine("case whatever");
        break;
}

Циклы

Всё как в С++

  • while
  • do-while
  • for
  • foreach

Массивы

Массивы позволяют хранить заранее известное кол-во элементов вместе

Инициализация массивов

int[] a = new int[3] {10, 20, 30};
double[] b = new double[5];
float[] c = {1.5f, 2.3f}; // Поймёт, что нужна длина 2

Длинна массивов

int[] a = {10, 20};
int len = a.Length;

Методы

int[] a = {10, 30, 20};

Array.IndexOf(a, 10) // Вернёт 0. -1, если не найдёт.
Array.Sort(a); // Сортирует по возрастанию. Станет {10, 20, 30}

Двумерный массив

int[,] a = new int[10,10];

Динамический массив

using System.Collections.Generic;

List<string> words = new List<string> ();
words.Add("Foo");
words.Add("Bar");
words.RemoveAt(1);

Random

Random r = new Random();
int a = r.Next(); // От 0 до 2 миллиардов
int b = r.Next(5); // От 0 до 5 (не включительно)
int c = r.Next(3, 5); // От 3 до 5

Функции

void Foo() {
    Console.WriteLine("Hello");
}

// Краткая форма
void Bar() => Console.WriteLine("Hi");

Параметры функции

int Sum(int x, int y) => x + y; // Тут x и y - параметры

Sum(5, 6); // Тут 5 и 6 - аргументы

Необязательные параметры

void PrintPerson(string name, int age = 1) {
    Console.WriteLine($"{name} - {age}");
}

PrintPerson("John", 5);
PrintPerson(age: 5, name: "Bob"); // Именованные параметры

Передача по ссылке

При передаче по ссылке и зменения внутри функции меняют оригинальное значение

void Inc(ref int a) {
    a++;
}

void BadInc(int a) {
    a++;
}

int b = 5;
Inc(ref b); // b == 6
BadInc(b); // b осталась 6

Inc(b); // Так низя
Inc(5); // И так низя
Inc(ref 5); // И так тоже низя

Выходной параметр

Функция может иметь несколько выходных параметров, а так лучше return

void Sum(int a, int b, out int result) {
    result = a + b;
}

int result;

Sum(5, 6, out result);

Входные параментры

Передача по неизменяемой ссылке. Судя по всему полезно только для массивов

int Sum(in int a, in int b) {
    return a + b;
}

int a = 5;
int b = 6;
Sum(a, b);

params

params позволяет передать не определённое кол-во параметров. После него не может быть больше параметров

int Sum(params int[] nums) {
    int sum = 0;

    foreach (int i in nums) {
        sum += i;
    }

    return sum;
}

int[] nums = {1, 2, 3, 4};
Sum(nums);
Sum(1, 2, 3);
Sum(20);
Sum();

Возвращение значений

int Sum1(int a, int b) {
    return a + b;
}

int Sum2(int a, int b) => a + b;