C# 1001 notes
6.51K subscribers
329 photos
9 videos
2 files
313 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
加入频道
#basics

№1. Метод Main() и его сигнатура

Стандартной точкой входа для приложений, разработанных на языке C# является статический метод с именем Main.

В большинстве случаев его объявление выглядит следующим образом:

static void Main(string[] args)

Начиная с C# 7.1 появилась возможность объявлять его в асинхронном виде:

static Task<int> Main(string[] args)

@csharp_1001_notes
#basics

№2. Минимально возможная программа на C#

Минимально возможная программа на языке C# будет состоять из класса, содержащего статический метод Main().

using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("It's just a start..");
}
}
}

При этом namespace и параметр args так же являются необязательными.

@csharp_1001_notes
#basics

№3. Кто автор языка C#

Язык C# был разработан группой инженеров компании Microsoft для платформы .NET в далёком 2000 году и изначально имел кодовое название COOL (C-style Object Oriented Language).

Главным архитектором является датский инженер-программист Anders Hjelsberg.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java.

@csharp_1001_notes
#basics

№4. Чем C# отличается от Java

Оба языка программирования являются объектно-ориентированными, унаследовали свой синтаксис от языка Си и исполняются в управляемой среде.

Как бы то ни было, между ними есть и различия. Далее основные из них:

🔶 class B extends A равнозначно class B : A

🔶 В Java отсутствуют namespace

🔶 В C# для синхронизации доступа между потоками используется lock, в то время как в Java synchronized

🔶 Наличие в С# модификатора доступа internal

🔶 Перечисления (enum) в Java являются полноценными классами 😲

🔶 C# позволяет использовать строковые литералы в конструкции switch

🔶 Программы на C# используют .NET Framework, в случае с Java это платформа Java SE.

@csharp_1001_notes
#basics

Чем C# отличается от VB .NET

Оба этих языка являются высокоуровневыми и входят в перечень языков программирования для платформы .NET. В основном их отличия синтаксические, но есть и более значительные.

О последних далее:

Есть в C# (нет в VB .NET):

🔶 Указатели и возможность писать unsafe код

🔶 Статические классы

🔶 Контроль переполнения checked/unchecked

🔶 Чувствительность к регистру (case-sensivity)

🔶 Более строгая проверка типов

🔶 Синтаксический сахар (делает язык менее многословным)

Есть в VB .NET (нет в C#):

🔶 XML литералы

🔶 Вспомогательные методы IsNumeric и PMT

🔶 Inline объявление дат, например #12/31/2000#

🔶 Оператор Like для сравнения строки с шаблоном

От себя замечу, что на сегодняшний день большинство проектов, которые продолжают использовать VB .NET являются скорее legacy (требующие сопровождения и исправления ошибок, нежели активной разработки).

C#, напротив, уверенно занял лидерство в качестве основного языка разработки для платформы .NET 😉

💬 Крайне показательным в этом случае являются результаты опроса на StackOverflow за 2018, в котором 34.4% опрошенных указали, что используют C#, в то время как у VB .NET эта цифра едва дотягивает до 6.8%.

@csharp_1001_notes
#basics

Абсолютно минимально возможная программа на C# и Quine

🔶 Ранее в заметке №2 я уже публиковал минимально возможную программу на C#, однако упомянул, что некоторые её части так же опциональны.

Дабы исправить эту оговорку , далее будет действительно самая маленькая (состоящая исключительно из обязательных частей) программа:

class Program
{
static void Main()
{
}
}

🔶 Довольно интересным типом программ, на мой взгляд, являются Куайны (Quine), названные так в честь американского логика и философа Willard Van Orman Quine (1908—2000).

Куайн (квайн, англ. quine) — компьютерная программа, которая выдаёт на выходе точную копию своего исходного текста.

Заинтригованы? Тогда попробуйте написать куайн на C# самостоятельно 😉

p.s. Один из многочисленных вариантов вы сможете найти по ссылке.

@csharp_1001_notes
#basics

Консольное приложение и класс Console

Консольный тип проектов один из самых простых и, вероятно, наиболее используемый при разработке на языке C#. Одним из определений консоли считают программное обеспечение, реализующее текстовый интерфейс.

Ниже я приведу основные методы класса Console (сигнатуры опущены намеренно ввиду наличия у некоторых из них перегрузок):

🔶 Console.Read - считать символ

🔶 Console.ReadLine - считать последовательность символов

🔶 Console.Write - отобразить значение

🔶 Console.WriteLine - отобразить значение и перевести каретку в начало ('\r') следующей строки ('\n')

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

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

💬 Почаще разбирайте код других разработчиков, чтобы набивать руку в чтении и подсматривать интересные для себя моменты, ведь программирование- это не только написание кода, но и его чтение ☝️

@csharp_1001_notes
#basics

Как и зачем возвращать результат выполнения метода Main

По умолчанию точка входа в наше приложение - метод Main объявлен с типом возвращаемого значения void. Однако, мы так же имеем возможность возвращать и целочисленное значение int (а начиная с C# 7.1 ещё и Task<int>):

class Program
{
static int Main()
{
if (DateTime.Today.DayOfWeek == DayOfWeek.Monday)
return -1; // Monday is bad
else
return 0;
}
}

Нужно это в первую очередь для того, чтобы код, вызывающий нашу программу, имел возможность отреагировать на результат её выполнения.

Стоит заметить, что сделать это получится лишь в том случае, когда информация о возвращаемых значениях и способах реагирования на них будет определена заранее, как в следующем примере на powershell:

dotnet run
if ($LastExitCode -eq 0) {
Write-Host "Execution succeeded"
} else
{
Write-Host "Execution Failed"
}
Write-Host "Return value = " $LastExitCode

💬 А знаете ли вы, что alias void в языке C# соответствует структуре public struct Void из сборки System? 😉

@csharp_1001_notes
Может ли Main быть public?

TL;DR
Может, но Microsoft не рекомендует:

Main must be static and it need not be public.

🔶 Почему может? Потому что язык C# и платформа .NET не накладывают никаких ограничений на модификаторы доступа для метода Main и следующий код будет успешно скомпилирован:

class Program
{
static public void Main()
{
Console.WriteLine("This would compile..");
}
}

🔶 Почему не рекомендуется? Потому что предполагается, что данный метод будет вызван лишь 1 раз исполняющей средой (CLR) и является точкой входа в ваше приложение.

В случае же наличия у него модификатора доступа public, он станет доступен для вызова из других частей вашего приложения.

💬 Тем, кто так же как и я озадачился закономерным вопросом "А как на самом деле вызывается метод Main и что происходит до него?" я прикладываю эту ссылку на строку в CoreCLR, ответственную за его вызов 😉

#basics
Идентификаторы и правила их именования в C#

Под идентификатором (identifier) в языке C# считаются любые имена, которые мы используем в именах переменных, классов, интерфейсов, методов, свойств, пространств имён и так далее.

На именование идентификаторов накладываются следующие ограничения:

🔸 Case sensitive - name != Name;

🔸 Не могут начинаться с цифр;

🔸 Не могут содержать пробелы;

🔸 Могут включать в себя Unicode символы: string имя = ""; и class 国家 { } вполне себе валидные идентификаторы, но делать так без необходимости противопоказано ⛔️ То же относится и к именованию файлов в вашем проекте;

🔸 Не могут совпадать с ключевыми словами (keywords) языка;

Что касается последнего правила, то обойти его можно используя символ @ в качестве префикса в имени идентификатора, однако, без веских на то причин, я вам так же порекомендую этого не делать:

class @class
{
int @int;
string @default;
}


#basics
Контекстные (Contextual) ключевые слова C#

Язык C# включает в себя перечень ключевых слов (keywords), использование которых определяется контекстом выполнения. Говоря проще, когда они находятся в нужном месте, они выполняют определённую для них функцию:

var x = "y";
dynamic m = "n";
string t = nameof(x);


В противном случае- они ничем не отличаются от обычных идентификаторов.

Вот их неполный список: async, dynamic, global, join, value, await, select, var, get, nameof, set и другие.

Более того, они не являются зарезервированными, а значит их можно (но так же не рекомендуется ⛔️) использовать в качестве имён без специального символа @ следующим образом:

var var = "";
bool async = false;
string dynamic = "";
int get = 1;


Стоит заметить, что кроме contextual keywords так же в языке существуют следующие группы ключевых слов:

🔸 Statement keywords;

🔸 Operator keywords;

🔸 Conversion keywords;

🔸 Access keywords;

🔸 Literal keywords;

🔸 Query keywords;

Количество ключевых слов продолжает рости по мере развития языка и на сегодняшний день оно составляет уже 78 штук.

Понравилась заметка? Тогда поделись ей с другими 😉

#basics
Что такое литералы (Literals) ключевые слова C#

Литерал - это способ представления значения в исходном коде. Чаще всего мы используем их при инициализации переменных и констант, передаче в качестве аргументов в вызовы методов, форматировании и проверке значений на равенство.

🔸 Boolean - true / false;

🔸 Integer - 12, 24L, 100UL, 0x7DC;

🔸 Floating-point - 1.0, 2.2F, 6.02E23, 123.45m;

🔸 Character - 'b', 'Y', '!', '\n', '\x04DA';

🔸 String - "C#", "Look Ӛ", "Line 1\nLine 2";

🔸 Null - null;

Начиная с C# 7.0 в нашем распоряжении так же появился не только новый вид литерала:

🔸 Binary - 0b00001111, 0b1111000011110000;

Но и весьма удобный с точки зрения читаемости способ их записи посредством разделения с помощью _:

ushort s1 = 0b1011_1100_1011_0011;
int x1 = 0x44aa_abcd;


Чуть более подробно можно почитать в этой замечательной статье.

💬 А знаете ли вы, что кроме стандартного объявления индексатора:

public string this[string key] {
get { return internalDictionary[key]; }
}

// Usage: something["x"]


Мы можем также использовать params:

public string this[params string[] keys] {
get { return internalDictionary[key]; }
}

// Usage: something["x", "y", "z"]


Ни разу не пригодилось, но крайне любопытно 😉

#basics