Как запускать приложение в Visual Studio с предопределёнными аргументами?
В предыдущей заметке мы рассматривали возможность использования аргументов, передаваемых при запуске нашего приложения через командную строку.
Сегодня я хочу поделиться с вами одним из способов указать необходимые аргументы при разработке в Visual Studio по умолчанию.
Это может быть особенно полезно как при отладке, так и в целях тестирования.
Сделать это можно в свойствах проекта:
Вот как это выглядит.
Так же стоит отметить, что:
🔶 Данный способ подходит для всех типов проектов: консольных, Win Forms, WPF и т.д.
🔶 Вы можете сами указать различный список аргументов для каждой из конфигураций (Debug или Release)
☝️ Однако, работает этот способ лишь в том случае, если приложение запускается непосредственно из среды разработки. Другими словами, в случае самостоятельного запуска .exe файла из каталога или командной строки указанные ранее аргументы передаваться не будут.
#visual_studio
В предыдущей заметке мы рассматривали возможность использования аргументов, передаваемых при запуске нашего приложения через командную строку.
Сегодня я хочу поделиться с вами одним из способов указать необходимые аргументы при разработке в Visual Studio по умолчанию.
Это может быть особенно полезно как при отладке, так и в целях тестирования.
Сделать это можно в свойствах проекта:
Properties > Debug > Command line arguments
.Вот как это выглядит.
Так же стоит отметить, что:
🔶 Данный способ подходит для всех типов проектов: консольных, Win Forms, WPF и т.д.
🔶 Вы можете сами указать различный список аргументов для каждой из конфигураций (Debug или Release)
☝️ Однако, работает этот способ лишь в том случае, если приложение запускается непосредственно из среды разработки. Другими словами, в случае самостоятельного запуска .exe файла из каталога или командной строки указанные ранее аргументы передаваться не будут.
#visual_studio
Telegraph
Default arguments of the command line
❇️ Выходные на пороге, а значит время очередного еженедельного дайджеста.
Предлагаю вашему внимаю самые 🔥 интересные вопросы этой недели:
🔸 C# Back to Basics – Ref and Out Keywords in C#
🔸 Непрерывный рост JSON
🔸 Find duplicate in array with a memory efficient approach
🔸 Принцип Дирихле́ для эффективного решения ☝️
🔸 IDictionary How to get the removed item value while removing
Всем отличных выходных 😉
#sof_weekly
Предлагаю вашему внимаю самые 🔥 интересные вопросы этой недели:
🔸 C# Back to Basics – Ref and Out Keywords in C#
🔸 Непрерывный рост JSON
🔸 Find duplicate in array with a memory efficient approach
🔸 Принцип Дирихле́ для эффективного решения ☝️
🔸 IDictionary How to get the removed item value while removing
Всем отличных выходных 😉
#sof_weekly
Форматирование и составные строки в C#?
В процессе разработки мы довольно часто сталкиваемся с необходимостью использования комбинированных из разных частей строк.
Чаще всего нам в этом помогает string.Format, принимающий шаблон строки и аргументы для подстановки.
Форматирование составных строк и доступные шаблоны темы достаточно обширные, поэтому я о них ещё напишу. А сейчас стоит упомяну лишь некоторые из их возможностей:
🔸 Подстановка
Использования индексов в фигурных скобках для позиционирования аргумента в итоговой строке:
🔸 Форматирование
🔥 Выравнивание
Указывая целочисленные значения после запятой мы можем задавать как отступы, так и выравнивание по левому/правому краям.
Результат выполнения.
#strings
В процессе разработки мы довольно часто сталкиваемся с необходимостью использования комбинированных из разных частей строк.
Чаще всего нам в этом помогает string.Format, принимающий шаблон строки и аргументы для подстановки.
Форматирование составных строк и доступные шаблоны темы достаточно обширные, поэтому я о них ещё напишу. А сейчас стоит упомяну лишь некоторые из их возможностей:
🔸 Подстановка
Использования индексов в фигурных скобках для позиционирования аргумента в итоговой строке:
string name = "C# channel";
int age = 1;
string res = string.Format("{0} is {1} yrs old.", name, age);
// Output:
// C# channel is 1 yrs old.
🔸 Форматирование
C2
как пример денежного формата:decimal value = 123.456m;
Console.WriteLine("Your account balance is {0:C2}.", value);
// Output:
// Your account balance is $123.46.
🔥 Выравнивание
Указывая целочисленные значения после запятой мы можем задавать как отступы, так и выравнивание по левому/правому краям.
Console.WriteLine("{0,-20} {1,5}\n", "Name", "Hours");
Результат выполнения.
#strings
Telegraph
String format: alignment
Использование массива параметров при форматировании строки в C#?
В том случае, когда список параметров для форматирования строки у нас достаточно длинный, или же он формируется динамически во время выполнения программы, мы можем воспользоваться одной из перегрузок метода string.Format, принимающей
Сделать это можно следующим образом:
Результат выполнения:
❓ Знали ли вы, что с помощью поля
#strings
В том случае, когда список параметров для форматирования строки у нас достаточно длинный, или же он формируется динамически во время выполнения программы, мы можем воспользоваться одной из перегрузок метода string.Format, принимающей
object[] args
.Сделать это можно следующим образом:
object[] args = { "London", 2017, 8825000 };
string res = string.Format("{0}'s population in {1} is {2:0,0}.", args);
Результат выполнения:
London's population in 2017 is 8.825.000.
❓ Знали ли вы, что с помощью поля
Console.Title
вы можете изменять имя окна вашего консольного приложения и даже сделать его анимированным? 😀#strings
Telegraph
C# animated console title
static void Main(string[] args) { string Progresbar = "This is animated title of Console"; var title = ""; while (true) { for (int i = 0; i < Progresbar.Length; i++) { title += Progresbar[i]; Console.Title = title; Thread.Sleep(100);…
Какие методы поддерживают форматирование составных строк в C#?
Ранее я уже упоминал, что одним из основных способов форматирования строк является использование метода string.Format, однако в платформе .NET он далеко не единственный.
Сегодня я приведу расширенный список, поддерживающий данную функциональность:
🔸 Console.Write / Console.WriteLine
🔸 Debug.WriteLine
🔸 StreamWriter.Write / StreamWriter.WriteLine
🔸 StringBuilder.AppendFormat
🔸 StringWriter.Write / StringWriter.WriteLine
🔸 TextWriter.Write / TextWriter.WriteLine
🔸 Trace.TraceError / Trace.TraceInformation
Другими словами, следующая строка:
Может быть переписана следующим образом:
❓ Минутка занимательных наблюдений: Размер окна консольного приложения, оказывается, также может изменяться во время исполнения с помощью метода
#strings
Ранее я уже упоминал, что одним из основных способов форматирования строк является использование метода string.Format, однако в платформе .NET он далеко не единственный.
Сегодня я приведу расширенный список, поддерживающий данную функциональность:
🔸 Console.Write / Console.WriteLine
🔸 Debug.WriteLine
🔸 StreamWriter.Write / StreamWriter.WriteLine
🔸 StringBuilder.AppendFormat
🔸 StringWriter.Write / StringWriter.WriteLine
🔸 TextWriter.Write / TextWriter.WriteLine
🔸 Trace.TraceError / Trace.TraceInformation
Другими словами, следующая строка:
string.Format("{0} is {1} yrs old.", name, age);
Может быть переписана следующим образом:
Console.Write("{0} is {1} yrs old.", name, age);
❓ Минутка занимательных наблюдений: Размер окна консольного приложения, оказывается, также может изменяться во время исполнения с помощью метода
Console.SetWindowSize(w, h)
🙂#strings
Telegraph
Change Console Window size
for (int i = 1; i < 40; i++) { Console.SetWindowSize(i, i); System.Threading.Thread.Sleep(50); }
Идентификаторы и правила их именования в C#
Под идентификатором (identifier) в языке C# считаются любые имена, которые мы используем в именах переменных, классов, интерфейсов, методов, свойств, пространств имён и так далее.
На именование идентификаторов накладываются следующие ограничения:
🔸 Case sensitive -
🔸 Не могут начинаться с цифр;
🔸 Не могут содержать пробелы;
🔸 Могут включать в себя Unicode символы:
🔸 Не могут совпадать с ключевыми словами (keywords) языка;
Что касается последнего правила, то обойти его можно используя символ
#basics
Под идентификатором (identifier) в языке C# считаются любые имена, которые мы используем в именах переменных, классов, интерфейсов, методов, свойств, пространств имён и так далее.
На именование идентификаторов накладываются следующие ограничения:
🔸 Case sensitive -
name
!= Name
;🔸 Не могут начинаться с цифр;
🔸 Не могут содержать пробелы;
🔸 Могут включать в себя Unicode символы:
string имя = "";
и class 国家 { }
вполне себе валидные идентификаторы, но делать так без необходимости противопоказано ⛔️ То же относится и к именованию файлов в вашем проекте;🔸 Не могут совпадать с ключевыми словами (keywords) языка;
Что касается последнего правила, то обойти его можно используя символ
@
в качестве префикса в имени идентификатора, однако, без веских на то причин, я вам так же порекомендую этого не делать:class @class
{
int @int;
string @default;
}
#basics
❇️ Рабочая неделя заканчивается, а значит пришло время очередной недельной подборки на выходные.
Предлагаю вашему внимаю самые 🔥 интересные статьи и вопросы этой недели:
🔸 Джеффри Рихтер о том, как кодить, писать книги и создавать свои компании
🔸 C# Back to Basics – Arrays in C#
🔸 What function will be called?
🔸 Enumeration in .NET V — ToList() or not ToList()?
🔸 How to round to nearest even integer?
Всем удачных выходных 😉
#sof_weekly
Предлагаю вашему внимаю самые 🔥 интересные статьи и вопросы этой недели:
🔸 Джеффри Рихтер о том, как кодить, писать книги и создавать свои компании
🔸 C# Back to Basics – Arrays in C#
🔸 What function will be called?
🔸 Enumeration in .NET V — ToList() or not ToList()?
🔸 How to round to nearest even integer?
Всем удачных выходных 😉
#sof_weekly
Контекстные (Contextual) ключевые слова C#
Язык C# включает в себя перечень ключевых слов (keywords), использование которых определяется контекстом выполнения. Говоря проще, когда они находятся в нужном месте, они выполняют определённую для них функцию:
В противном случае- они ничем не отличаются от обычных идентификаторов.
Вот их неполный список:
Более того, они не являются зарезервированными, а значит их можно (но так же не рекомендуется ⛔️) использовать в качестве имён без специального символа
Стоит заметить, что кроме contextual keywords так же в языке существуют следующие группы ключевых слов:
🔸 Statement keywords;
🔸 Operator keywords;
🔸 Conversion keywords;
🔸 Access keywords;
🔸 Literal keywords;
🔸 Query keywords;
Количество ключевых слов продолжает рости по мере развития языка и на сегодняшний день оно составляет уже 78 штук.
✅ Понравилась заметка? Тогда поделись ей с другими 😉
#basics
Язык 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
Docs
C# Keywords and contextual keywords - C# reference
C# Keywords: Find the reference material for the predefined keywords and contextual keywords defined in the C# language.
Что такое литералы (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;
Но и весьма удобный с точки зрения читаемости способ их записи посредством разделения с помощью
Чуть более подробно можно почитать в этой замечательной статье.
💬 А знаете ли вы, что кроме стандартного объявления индексатора:
Мы можем также использовать
Ни разу не пригодилось, но крайне любопытно 😉
#basics
Литерал - это способ представления значения в исходном коде. Чаще всего мы используем их при инициализации переменных и констант, передаче в качестве аргументов в вызовы методов, форматировании и проверке значений на равенство.
🔸 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
Булевы (Boolean) литералы в C#
Булевы литералы или, говоря проще, логические значения "Истина" (да) и "Ложь" (нет) представлены ключевыми словами true и false.
В исходном коде чаще всего используется ключевое слово bool, являющееся на деле alias для структуры System.Boolean:
Значением по умолчанию является false.
💬 Задумывались ли вы, почему в языке C# тип System.Boolean занимает 1 байт? Ведь для кодирования значений 0 и 1 достаточно всего лишь одного бита.
Если вам интересно, почему же так происходит, то по этой ссылке вы узнаете ответ 😉
#basics
Булевы литералы или, говоря проще, логические значения "Истина" (да) и "Ложь" (нет) представлены ключевыми словами true и false.
В исходном коде чаще всего используется ключевое слово bool, являющееся на деле alias для структуры System.Boolean:
bool isValid = true;
bool hasErrors = false;
Значением по умолчанию является false.
💬 Задумывались ли вы, почему в языке C# тип System.Boolean занимает 1 байт? Ведь для кодирования значений 0 и 1 достаточно всего лишь одного бита.
Если вам интересно, почему же так происходит, то по этой ссылке вы узнаете ответ 😉
#basics
Выражения, операторы и операнды в C#
Ранее мы уже рассматривали литералы и типы данных. Сегодня предлагаю определить такие понятия как выражения, операторы и операнды.
Чаще всего выражение состоит из оператора, операндов и присваивания результата выполнения и выглядит следующим образом:
В данном примере "+" является оператором сложения, который применяется к двум операндам (1 и 2), результат выполнения которого присваивается оператором "=" переменной типа int.
Разумеется, в качестве операндов могут выступать не только литералы, но и переменные, константы, результаты выполнения других операторов или методов и так далее.
Говоря про оператор присваивания можно заметить, что он достаточно прост и принимает два операнда. Left hand операнд является переменной, которой будет присвоен right hand операнд.
Операторы присваивания и сложения это далеко не все доступные операторы. На данный момент их количество в языке C# составляет уже более 42 штук.
💯 Дорогие подписчики, сегодня, в 256 день в году, поздравляю всех вас с днём программиста 🍰 А наш канал, со своей первой важной отметкой в 100 читателей. Спасибо что вы с нами!
#basics
Ранее мы уже рассматривали литералы и типы данных. Сегодня предлагаю определить такие понятия как выражения, операторы и операнды.
Чаще всего выражение состоит из оператора, операндов и присваивания результата выполнения и выглядит следующим образом:
int result = 1 + 2;
В данном примере "+" является оператором сложения, который применяется к двум операндам (1 и 2), результат выполнения которого присваивается оператором "=" переменной типа int.
Разумеется, в качестве операндов могут выступать не только литералы, но и переменные, константы, результаты выполнения других операторов или методов и так далее.
Говоря про оператор присваивания можно заметить, что он достаточно прост и принимает два операнда. Left hand операнд является переменной, которой будет присвоен right hand операнд.
x = 10;
// = - operator
// x - left hand operand
// 10 - right hand operand
x = y + z;
// = - operator
// x - left hand operand
// (y + z) - right hand operand
// + - operator
// y - left hand operand
// z - right hand operand
Операторы присваивания и сложения это далеко не все доступные операторы. На данный момент их количество в языке C# составляет уже более 42 штук.
💯 Дорогие подписчики, сегодня, в 256 день в году, поздравляю всех вас с днём программиста 🍰 А наш канал, со своей первой важной отметкой в 100 читателей. Спасибо что вы с нами!
#basics
❇️ Всех ещё раз с прошедшим днём программиста! А сегодня уже пятница, а значит время очередной еженедельной подборки по C# и .NET.
Предлагаю вашему внимаю самые 🔥 интересные статьи и вопросы этой недели:
🔸 What's Coming to C#?
🔸 Keynote from the people who build .NET
🔸 C# Back to Basics – Working With Files, File and Directory
🔸 How to determine the size of var?
Всем удачных выходных 😉
#sof_weekly
Предлагаю вашему внимаю самые 🔥 интересные статьи и вопросы этой недели:
🔸 What's Coming to C#?
🔸 Keynote from the people who build .NET
🔸 C# Back to Basics – Working With Files, File and Directory
🔸 How to determine the size of var?
Всем удачных выходных 😉
#sof_weekly
Порядок выполнения операторов в C#
Каждый оператор в языке C# характеризуется приоритетом, в котором он будет выполнен при исполнении выражения.
В том случае, когда выражение содержит операторы, приоритет выполнения которых одинаковый, то исполнение осуществляется слева направо, за исключением операторов присваивания и сравнения (у них порядок справа налево).
Далее представлены группы операторов, отсортированные по приоритету (в рамках группы приоритет одинаковый):
Стоит так же заметить, что порядок выполнения операторов в выражении может быть изменён путём добавления круглых скобок (в таком случае по аналогии с математическими выражениями, приоритет исполнения заключённых операторов будет выше).
#basics
Каждый оператор в языке C# характеризуется приоритетом, в котором он будет выполнен при исполнении выражения.
В том случае, когда выражение содержит операторы, приоритет выполнения которых одинаковый, то исполнение осуществляется слева направо, за исключением операторов присваивания и сравнения (у них порядок справа налево).
Далее представлены группы операторов, отсортированные по приоритету (в рамках группы приоритет одинаковый):
🔸 Pimary: x.y f(x) a[x] x++ x– new typeof checked unchecked
🔸 Unary: + – ! ~ ++x –x (T)x
🔸 Multiplicative: * / %
🔸 Additive: + –
🔸 Shift: << >>
🔸 Relational: < > <= >= is as
🔸 Equality: == !=
🔸 Logical AND: &
🔸 Logical XOR: ^
🔸 Logical OR: |
🔸 Conditional AND: &&
🔸 Conditional OR: ||
🔸 Conditional: ?:
🔸 Assignment: = *= /= %= += -= <<= >>= &= ^= |=
Стоит так же заметить, что порядок выполнения операторов в выражении может быть изменён путём добавления круглых скобок (в таком случае по аналогии с математическими выражениями, приоритет исполнения заключённых операторов будет выше).
#basics
Комментарии в C#
В исходном коде на языке C# доступна возможность оставлять комментарии, которые будут проигнорированы компилятором и не окажут никакого эффекта на итоговую программу.
Есть 2 способа это сделать:
🔸 Однострочный комментарий - начинается с двойных слешей
🔸 Многострочный комментарий - окружён с обоих сторон слешом и звёздочкой
Отдельно стоит упомянуть так же XML Comments (подробнее), которые благодаря стандартизации в дальнейшем используются не только при подсказках IntelliSense, но и являются источником данных при генерации документации на основании кода (например в Swagger):
☝️ Полезными в данном случае горячими клавишами при разработке являются Ctrl+K, Ctrl+C (закомментировать выделенное) и Ctrl+K, Ctrl+U (раскомментировать выделенное).
Подробнее по теме порекомендую почитать следующую статью: комментирование кода - хорошие, плохие и отвратительные комментарии.
#basics
В исходном коде на языке C# доступна возможность оставлять комментарии, которые будут проигнорированы компилятором и не окажут никакого эффекта на итоговую программу.
Есть 2 способа это сделать:
🔸 Однострочный комментарий - начинается с двойных слешей
// Adds two integers and returns the result
public static int Add(int a, int b) {
}
🔸 Многострочный комментарий - окружён с обоих сторон слешом и звёздочкой
/*
The main Math class
Contains all methods for performing basic math functions
*/
public class Math {
}
Отдельно стоит упомянуть так же XML Comments (подробнее), которые благодаря стандартизации в дальнейшем используются не только при подсказках IntelliSense, но и являются источником данных при генерации документации на основании кода (например в Swagger):
/// <summary>
/// This class performs an important function.
/// </summary>
public class MyClass {}
☝️ Полезными в данном случае горячими клавишами при разработке являются Ctrl+K, Ctrl+C (закомментировать выделенное) и Ctrl+K, Ctrl+U (раскомментировать выделенное).
Подробнее по теме порекомендую почитать следующую статью: комментирование кода - хорошие, плохие и отвратительные комментарии.
#basics
Типы, переменные, значения, экземпляры и выражения в C#
В языке C# тип (например
Переменная является хранилищем данных. Каждая переменная может содержать значение конкретного типа (экземпляр), которое может меняться во время исполнения программы.
Константы являются переменными, значения которых неизменны и определены уже на этапе компиляции. Они так же хранят в себе значения (экземпляры) конкретных типов.
Выражения возвращают конкретные значения по итогу их успешного исполнения. У выражений так же есть конкретный тип.
В языке C# доступны не только большое кол-во встроенных типов (например
💬 Вот такое на первый взгляд необычное поведение связано с особенностью констант в языке C#. Если вас оно удивляет, то по ссылке вы найдёте ответ на вопрос, почему так происходит.
#data_types
В языке C# тип (например
int
) определяет каким будет значение (42
) хранящееся в переменной. Переменная является хранилищем данных. Каждая переменная может содержать значение конкретного типа (экземпляр), которое может меняться во время исполнения программы.
Константы являются переменными, значения которых неизменны и определены уже на этапе компиляции. Они так же хранят в себе значения (экземпляры) конкретных типов.
Выражения возвращают конкретные значения по итогу их успешного исполнения. У выражений так же есть конкретный тип.
В языке C# доступны не только большое кол-во встроенных типов (например
int
, float
), но и конструкции, позволяющие описывать свои собственные типы (class
, enum
, struct
).💬 Вот такое на первый взгляд необычное поведение связано с особенностью констант в языке C#. Если вас оно удивляет, то по ссылке вы найдёте ответ на вопрос, почему так происходит.
#data_types
Telegraph
static vs const
There are situations where a const and a non-const have different semantics. For example: const int y = 42; static void Main() { short x = 42; Console.WriteLine(x.Equals(y)); } prints out True, whereas: static readonly int y = 42; static void Main() { short…
Value и reference типы в языке C#
Значимые и ссылочные типы являются по праву одними из базисов языка C#, а вопрос об их отличиях, как следствие, одним из самых избитых на собеседованиях, поэтому сегодня я постараюсь ответить на него со всеми подробностями:
Значимые типы:
🔸 Унаследованы от System.ValueType (которые, в свою очередь, от System.Object)
🔸 Переменная хранит непосредственно значение, а в случае присваивания его копию
🔸 В качестве аргументов передаются по значению (копируются)
🔸 Не очищаются сборщиком мусора, не имеют деструктор и финализатор
🔸 Объявляются как структура (struct) или перечисление (enum)
🔸 Объявлены с модификатором sealed, а значит не могут выступать базовыми типами для наследников
Ссылочные типы:
🔸 Унаследованы от System.Object или иного ссылочного типа
🔸 Память под экземпляры выделяется в управляемой куче (managed heap)
🔸 Переменная хранит адрес (указатель) на участок памяти в управляемой куче, где уже хранится непосредственно значение (или null)
🔸 В качестве аргументов передаются по ссылке (указатель)
🔸 Очищаются сборщиком мусора
🔸 Объявляются как класс (class), делегат (delegate) или интерфейс (interface)
🔸 Поддерживают наследование
Одной из лучших и наиболее ёмких, на мой взгляд, статей по этой теме является Memory in .NET - what goes where от Jon Skeet'а.
💬 Я намеренно не стал приводить информацию о том, что значимые типы хранятся в стеке (потока выполнения). Дело в том, что это не совсем так. Подробнее про детали реализации value type и механизм выделения памяти для значений можно почитать в статье Eric Lipert'а: The Truth About Value Types.
✅ Понравилась заметка? Так поделись и с другими 😉
#data_types
Значимые и ссылочные типы являются по праву одними из базисов языка C#, а вопрос об их отличиях, как следствие, одним из самых избитых на собеседованиях, поэтому сегодня я постараюсь ответить на него со всеми подробностями:
Значимые типы:
🔸 Унаследованы от System.ValueType (которые, в свою очередь, от System.Object)
🔸 Переменная хранит непосредственно значение, а в случае присваивания его копию
🔸 В качестве аргументов передаются по значению (копируются)
🔸 Не очищаются сборщиком мусора, не имеют деструктор и финализатор
🔸 Объявляются как структура (struct) или перечисление (enum)
🔸 Объявлены с модификатором sealed, а значит не могут выступать базовыми типами для наследников
Ссылочные типы:
🔸 Унаследованы от System.Object или иного ссылочного типа
🔸 Память под экземпляры выделяется в управляемой куче (managed heap)
🔸 Переменная хранит адрес (указатель) на участок памяти в управляемой куче, где уже хранится непосредственно значение (или null)
🔸 В качестве аргументов передаются по ссылке (указатель)
🔸 Очищаются сборщиком мусора
🔸 Объявляются как класс (class), делегат (delegate) или интерфейс (interface)
🔸 Поддерживают наследование
Одной из лучших и наиболее ёмких, на мой взгляд, статей по этой теме является Memory in .NET - what goes where от Jon Skeet'а.
💬 Я намеренно не стал приводить информацию о том, что значимые типы хранятся в стеке (потока выполнения). Дело в том, что это не совсем так. Подробнее про детали реализации value type и механизм выделения памяти для значений можно почитать в статье Eric Lipert'а: The Truth About Value Types.
✅ Понравилась заметка? Так поделись и с другими 😉
#data_types
❇️ Эта рабочая неделя оказалась весьма плодовита на интересные вопросы и статьи, которыми и спешу с вами поделиться в рамках очередной еженедельной подборки по C# и .NET.
Предлагаю вашему внимаю самые 🔥 интересные статьи и вопросы этой недели:
C#:
🔸 C# Intermediate – Properties in C#
🔸 C# 8 Small Features
🔸 Null coalescing operator IList, Array, Enumerable.Empty in foreach
🔸 C# Asynchronous with task is slower than synchronous
Debugging:
🔸 Отладка как процесс
🔸 Breakpoints FAQ: How can I pause my code in Visual Studio?
Performance:
🔸 Struct и readonly: как избежать падения производительности
🔸 Performance of value-type vs reference-type enumerators
Common:
🔸 Как мы создали технологичный продукт и провалились на дно
🔸 23 рекомендации для читабельного кода
Всем хороших и плодотворных выходных 😉
#sof_weekly
Предлагаю вашему внимаю самые 🔥 интересные статьи и вопросы этой недели:
C#:
🔸 C# Intermediate – Properties in C#
🔸 C# 8 Small Features
🔸 Null coalescing operator IList, Array, Enumerable.Empty in foreach
🔸 C# Asynchronous with task is slower than synchronous
Debugging:
🔸 Отладка как процесс
🔸 Breakpoints FAQ: How can I pause my code in Visual Studio?
Performance:
🔸 Struct и readonly: как избежать падения производительности
🔸 Performance of value-type vs reference-type enumerators
Common:
🔸 Как мы создали технологичный продукт и провалились на дно
🔸 23 рекомендации для читабельного кода
Всем хороших и плодотворных выходных 😉
#sof_weekly
Встроенные типы и C# keywords
Язык C# включает в себя большой набор встроенных (примитивных) типов, которые мы можем использовать при разработке наших программ.
Каждый их них имеет своё ключевое слово (keyword), которое соответствует встроенному типу платформы .NET. Другими словами, keyword является лишь сокращением или синонимом (alias) для конкретного типа (реализация которого находится в библиотеке BCL - base class library).
Далее представлены все доступные нам встроенные типы в формате C# тип - .NET тип - границы значений:
🔸 bool – System.Boolean – 1 byte (true|false)
🔸 byte – System.Byte – 1 byte (0 to 255)
🔸 sbyte – System.SByte – 1 byte (-128 to 127)
🔸 short – System.Int16 – 2 bytes (-32,768 to 32,767)
🔸 ushort – System.UInt16 – 2 bytes (0 to 65,535)
🔸 int – System.Int32 – 4 bytes (-2,147,483,648 to 2,147,483,647)
🔸 uint – System.UInt32 – 4 bytes (0 to 4,294,967,295)
🔸 long – System.Int64 – 8 bytes (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
🔸 ulong – System.UInt64 – 8 bytes (0 to 18,446,744,073,709,551,615)
🔸 float – System.Single – 4 bytes (±1.5e−45 to ±3.4e38, 7 digit precision)
🔸 double – System.Double – 8 bytes (±5.0e−324 to ±1.7e308, 15-16 digit precision)
🔸 decimal – System.Decimal – 16 bytes (±1.0 × 10−28 to ±7.9 × 1028, 28-29 digit precision)
🔸 char – System.Char – 2 bytes (U+0000 to U+ffff, UTF16 Unicode character)
🔸 object - System.Object
Подробнее: Built-in types table - C# Reference.
#data_types
Язык C# включает в себя большой набор встроенных (примитивных) типов, которые мы можем использовать при разработке наших программ.
Каждый их них имеет своё ключевое слово (keyword), которое соответствует встроенному типу платформы .NET. Другими словами, keyword является лишь сокращением или синонимом (alias) для конкретного типа (реализация которого находится в библиотеке BCL - base class library).
Далее представлены все доступные нам встроенные типы в формате C# тип - .NET тип - границы значений:
🔸 bool – System.Boolean – 1 byte (true|false)
🔸 byte – System.Byte – 1 byte (0 to 255)
🔸 sbyte – System.SByte – 1 byte (-128 to 127)
🔸 short – System.Int16 – 2 bytes (-32,768 to 32,767)
🔸 ushort – System.UInt16 – 2 bytes (0 to 65,535)
🔸 int – System.Int32 – 4 bytes (-2,147,483,648 to 2,147,483,647)
🔸 uint – System.UInt32 – 4 bytes (0 to 4,294,967,295)
🔸 long – System.Int64 – 8 bytes (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
🔸 ulong – System.UInt64 – 8 bytes (0 to 18,446,744,073,709,551,615)
🔸 float – System.Single – 4 bytes (±1.5e−45 to ±3.4e38, 7 digit precision)
🔸 double – System.Double – 8 bytes (±5.0e−324 to ±1.7e308, 15-16 digit precision)
🔸 decimal – System.Decimal – 16 bytes (±1.0 × 10−28 to ±7.9 × 1028, 28-29 digit precision)
🔸 char – System.Char – 2 bytes (U+0000 to U+ffff, UTF16 Unicode character)
🔸 object - System.Object
Подробнее: Built-in types table - C# Reference.
#data_types
Строковый тип в C#
В дополнении к большому количеству встроенных значимых типов, таким как целочисленные или с плавающей точкой, язык C# так же предоставляет возможность использования встроенного типа для строк.
Тип string является ссылочным и в платформе .NET (или как упоминалось ранее, в библиотеке BCL) соответствует System.String.
Строки содержат последовательность Unicode (UTF16) символов, являясь эквивалентом массиву элементов типа char, а каждый символ (элемент) занимает ровно 2 байта.
Строковый тип является неизменяемым (immutable), другими словами мы не можем изменить значение строки, не пометив на удаление старое и не создав при этом новое.
Так же нам доступен индексатор (оператор обращения по индексу) [] для доступа к конкретным символам строки.
Небольшой пример работы со строками.
Подробнее про строковый тип: Strings in C# and .NET.
💬 Если факт неизменяемости строк довольно известен, то причины этого порой не так очевидны. Исчерпывающий на мой взгляд ответ по этой теме вы сможете найти по следующей ссылке.
#data_types
В дополнении к большому количеству встроенных значимых типов, таким как целочисленные или с плавающей точкой, язык C# так же предоставляет возможность использования встроенного типа для строк.
Тип string является ссылочным и в платформе .NET (или как упоминалось ранее, в библиотеке BCL) соответствует System.String.
Строки содержат последовательность Unicode (UTF16) символов, являясь эквивалентом массиву элементов типа char, а каждый символ (элемент) занимает ровно 2 байта.
Строковый тип является неизменяемым (immutable), другими словами мы не можем изменить значение строки, не пометив на удаление старое и не создав при этом новое.
Так же нам доступен индексатор (оператор обращения по индексу) [] для доступа к конкретным символам строки.
Небольшой пример работы со строками.
Подробнее про строковый тип: Strings in C# and .NET.
💬 Если факт неизменяемости строк довольно известен, то причины этого порой не так очевидны. Исчерпывающий на мой взгляд ответ по этой теме вы сможете найти по следующей ссылке.
#data_types
Тип object в C#
Все типы платформы .NET являются наследниками System.Object, синонимом которого в языке C# является ключевое слово object.
System.Object является базовым не только для встроенных типов, но и тех, которые мы определяем самостоятельно, а значит экземпляр любого типа может быть приведён к object:
Любой класс который мы определяем в C# также автоматически является наследником от object.
Тип object определяет следующий набор доступных для использования экземплярных методов:
🔸 bool Equals(object)
🔸 void Finalize()
🔸 int GetHashCode()
🔸 Type GetType()
🔸 object MemberwiseClone()
🔸 string ToString()
Статические методы включают в себя:
🔸 bool Equals(object, object)
🔸 bool ReferenceEquals(object, object)
Другими словами, каждый из приведённых выше методов унаследован и автоматически доступен при разработке.
💬 Знаете ли вы, что в 64-битных платформах Garbage Collector не позволяет выделять объекты, размер которых превышает 2 GB и выбрасывает OutOfMemoryException? Помочь с этим нам может специальный элемент конфигурации: gcAllowVeryLargeObjects.
#data_types
Все типы платформы .NET являются наследниками System.Object, синонимом которого в языке C# является ключевое слово object.
System.Object является базовым не только для встроенных типов, но и тех, которые мы определяем самостоятельно, а значит экземпляр любого типа может быть приведён к object:
string msg = "A string";
int n = 42;
Person me = new Person("John", 33);
// Can assign anything to an object variable
object o = msg;
o = n;
o = me;
Любой класс который мы определяем в C# также автоматически является наследником от object.
Тип object определяет следующий набор доступных для использования экземплярных методов:
🔸 bool Equals(object)
🔸 void Finalize()
🔸 int GetHashCode()
🔸 Type GetType()
🔸 object MemberwiseClone()
🔸 string ToString()
Статические методы включают в себя:
🔸 bool Equals(object, object)
🔸 bool ReferenceEquals(object, object)
Другими словами, каждый из приведённых выше методов унаследован и автоматически доступен при разработке.
💬 Знаете ли вы, что в 64-битных платформах Garbage Collector не позволяет выделять объекты, размер которых превышает 2 GB и выбрасывает OutOfMemoryException? Помочь с этим нам может специальный элемент конфигурации: gcAllowVeryLargeObjects.
#data_types