c sharp пример кода
C sharp пример кода
БлогNot. Примеры консольных приложений на C#
Примеры консольных приложений на C#
сейчас в списке: 16 приложений Здесь размещены небольшие учебные примеры приложений на C#, проверенные в актуальной на момент создания статьи сборке Visual Studio 2019.
Логического порядка в примерах нет, будут добавляться по мере написания. Для поиска на странице нужного слова используйте комбинацию клавиш Ctrl+F в своём браузере.
1. Табулирование функций
С помощью делегата Function строим таблицы значений двух различных функций одним и тем же кодом.
2. Второй класс в проекте, генерирующий случайное число
Если классы располагаются в одном пространстве имён, для ссылки на метод объекта второго класса главной программе достаточно выполнить что-то вроде
3. Два класса в одном файле
Достаточно, чтобы каждый класс располагался в своих операторных скобках внутри общего namespace
4. Матрицы обычная и ступенчатая
Показаны выделение памяти, заполнение и построчный вывод элементов.
5. Шаблон класса стека
Показаны стек целых и стек вещественных чисел, использующие один и тот же шаблон класса.
6. Шаблон функции и аргументы по ссылке
Передача и возврат аргументов по ссылке, функция с переменным числом аргументов.
7. Фабрика объектов
Так называют статический метод в классе, возвращающий новый объект этого же класса. Имеет смысл, если по каким-то причинам не хотим делать конструктор класса публичным методом.
8. Статические члены класса и оценивание арифметических выражений
Описываем в классе статический счётчик созданных объектов и оцениваем арифметические выражения одной строчкой кода с проверкой корректности (метод Exec ).
9. Работаем с объектом «Таблица данных»
Программно создаём таблицу с заданными характеристиками, добавляем туда данные строк и вычисляемый столбец, считаем по формулам с помощью агрегатных выражений.
10. Запускаем десять потоков и выводим их состояние
Управляем временем выполнения потоков, а также позицией курсора в консоли (для вывода сообщений о состоянии потоков).
11. Перегрузка операторов
Показаны все основные виды переопределения операторов в классе C# (кроме некоторых редко используемых нюансов).
12. Три способа преобразовать строку в число
Основные способы и простейшая обработка исключений при преобразовании.
13. Шесть способов преобразовать число в строку
Способы как с добавлением, так и без добавления дополнительного текстового содержимого к полученной строке.
14. Индексаторы, свойства и автоматически реализуемые свойства
Пример на индексаторы и свойства C#.
15. Наследование
Довольно развёрнутый пример, показывающий особенности реализации наследования в классах C#.
Абстрактный, базовый и производный классы, приватные данные и публичные свойства-«обёртки» над ними, абстрактные и виртуальные методы, приватные, публичные и защищённые члены класса, неуниверсальный статический класс с расширениями, класс, запрещённый к наследованию, массив из объектов базового класса.
Далее показан вывод этого приложения:
16. Упаковка и распаковка
Все типы в С#, включая простые типы значений, являются производными от класса object. Следовательно, ссылкой типа object можно воспользоваться для обращения к любому другому типу, в том числе и к типам значений.
Когда ссылка на объект класса object используется для обращения к типу значения, такой процесс называется упаковкой. Упаковка приводит к тому, что значение простого типа сохраняется в экземпляре объекта, т.е. «упаковывается» в объекте, который затем используется как и любой другой объект. Но в любом случае упаковка происходит автоматически. Для этого достаточно присвоить значение переменной ссылочного типа object, а об остальном позаботится компилятор.
Распаковка представляет собой процесс извлечения упакованного значения из объекта. Это делается с помощью явного приведения типа ссылки на объект класса object к соответствующему типу значения. Попытка распаковать объект в другой тип может привести к ошибке времени выполнения.
В примере значение типа int передаётся в качестве аргумента методу Sqr(), который, в свою очередь, принимает параметр типа object.
Также показана работа с массивом из разнотипных элементов, точнее, из элементов базового класса object.
Учимся C#. Ведро первое.
.NET Framework Class Library — это набор классов на все случаи жизни.
Основы C#
Для удобного исполнения примеров рекомендую вам скачать бесплатный Visual Studio 2008 Express, а у кого траффик не казенный, то можете использовать #Develop — это OpenSource проект с открытым исходным кодом.
Начнём с немного боянного уже примера — Hello World!
где TargetFile.exe — это выходной файл, а SourceFile.cs — файл, где вы набрали вышенаписанный код.
Давайте разберём код, который мы написали.
using подключает пространство имён System, которое включает в себя методы ввода/вывода и нужные типы.
class HelloWorld — объявили новый класс, который мы обозвали как HelloWorld. Чуть позже я вам расскажу про классы более подробнее, а пока вам надо понять, что любая программа на C# состоит из классов.
Далее идёт метод Main() — это дверь для компилятора. Свою работу он будет начинать отсюда. Метод Main() обязателен для любой программы и его имя должно писаться именно так. В C# регистр имеет значение ;).
[модификатор] возвращаемый_тип ИмяМетода([параметр])
<
//тело метода
>
Вот как выглядят методы. Сначала идёт модификатор, затем надо указать тип данных, которые он будет возвращать, имя самого метода, а в скобках параметры, которые он принимает. Про всё это вы узнаете из будущих статей, а пока просто попытайтесь запомнить.
Квадратные скобки обозначают необязательные параметры. Модификаторы используются для указания особенностей вызова метода, например, откуда он может быть вызван.
Hello World — интерактивный учебник по основам C#
Это руководство поможет в интерактивном изучении C#. С помощью браузера вы напишете код C# и сможете просмотреть результаты его компиляции и выполнения. Руководство содержит ряд задач, первой из которых будет написание программы Hello World. В рамках этих занятий вы ознакомитесь с основами языка C#.
Запуск первой программы C#
Запустите приведенный ниже код в интерактивном окне. Нажмите кнопку Перейти в режим фокусировки. Затем введите следующий блок кода в интерактивном окне и нажмите кнопку Выполнить:
Объявление и использование переменных
При помощи вашей первой программы на экран выводится string «Hello World!».
Вероятнее всего, при изучении C# (как и любого другого языка программирования) вы будете допускать ошибки в коде. Компилятор найдет эти ошибки и сообщит вам о них. Если результат содержит сообщения об ошибках, внимательно просмотрите пример кода и код в интерактивном окне, чтобы понять, что нужно исправить. Это упражнение поможет вам изучить структуру кода C#.
Функции первой программы ограничиваются выводом одного сообщения. Вы можете создавать более полезные программы с использованием переменных. Переменная — это символ, который вы можете использовать для выполнения одного и того же кода с разными значениями. Попробуем сделать это. Замените код, написанный в интерактивном окне, следующим:
Любой объявляемой переменной можно присваивать разные значения. Можно назначить переменной имя одного из ваших друзей. Добавьте эти две строки в интерактивном окне после уже добавленного вами кода. Обязательно сохраните объявление переменной aFriend и ее начальное присваивание.
Как вы могли заметить, слово Hello в двух последних сообщениях отсутствует. Исправим это. Измените строки, которые выводят сообщение, следующим образом:
Снова нажмите кнопку Выполнить, чтобы просмотреть результаты.
Вы уже использовали + для создания строк из переменных и констант. Но есть способ лучше. Вы можете поместить переменную между символами < и >, чтобы код C# заменял этот текст значением переменной.
Снова нажмите кнопку Выполнить, чтобы просмотреть результаты. Вместо «Hello
Краткий обзор языка C#
C# — это объектно- и компонентно-ориентированный _ язык программирования. C# предоставляет языковые конструкции для непосредственной поддержки такой концепции работы. Благодаря этому C# подходит для создания и применения программных компонентов. С момента создания язык C# обогатился функциями для поддержки новых рабочих нагрузок и современными рекомендациями по разработке ПО. C# — это _ объектно-ориентированный язык. Вы определяете типы и их поведение.
Исходный код, написанный на языке C# компилируется в промежуточный язык (IL), который соответствует спецификациям CLI. Код на языке IL и ресурсы, в том числе растровые изображения и строки, сохраняются в сборке, обычно с расширением .dll. Сборка содержит манифест с информацией о типах, версии, языке и региональных параметрах для этой сборки.
При выполнении программы C# сборка загружается в среду CLR. Среда CLR выполняет JIT-компиляцию из кода на языке IL в инструкции машинного языка. Среда CLR также выполняет другие операции, например, автоматическую сборку мусора, обработку исключений и управление ресурсами. Код, выполняемый средой CLR, иногда называют «управляемым кодом», чтобы подчеркнуть отличия этого подхода от «неуправляемого кода», который сразу компилируется в машинный язык для определенной платформы.
Здравствуй, мир
Для первого знакомства с языком программирования традиционно используется программа «Hello, World». Вот ее пример на C#:
Типы и переменные
Тип определяет структуру и поведение любых данных в C#. Объявление типа может включать его члены, базовый тип, интерфейсы, которые он реализует, и операции, разрешенные для этого типа. Переменная — это метка, которая ссылается на экземпляр определенного типа.
В C# существуют две разновидности типов: ссылочные типы и типы значений. Переменные типа значений содержат непосредственно данные, а в переменных ссылочных типов хранятся ссылки на нужные данные, которые именуются объектами. Две переменные ссылочного типа могут ссылаться на один и тот же объект, поэтому может случиться так, что операции над одной переменной затронут объект, на который ссылается другая переменная. Каждая переменная типа значения имеет собственную копию данных, и операции над одной переменной не могут затрагивать другую (за исключением переменных параметров ref и out ).
Типы значений в C# делятся на простые типы, типы перечислений, типы структур, типы, допускающие значение NULL, и типы значений кортежей. Ссылочные типы в C# подразделяются на типы классов, типы интерфейсов, типы массивов и типы делегатов.
Далее представлены общие сведения о системе типов в C#.
Программы C# используют объявления типов для создания новых типов. В объявлении типа указываются имя и члены нового типа. Шесть категорий типов в C# определяются пользователем: типы классов, типы структур, типы интерфейсов, типы перечисления, типы делегатов и типы значений кортежей.
В C# существует несколько типов переменных, в том числе поля, элементы массива, локальные переменные и параметры. Переменные представляют собой места хранения, и каждая переменная имеет тип, который определяет допустимые значения для хранения в этой переменной. Примеры представлены ниже.
Структура программы
В качестве небольшого примера рассмотрим сборку, содержащую следующий код:
Сборка полностью описывает сама себя и содержит весь код и метаданные, поэтому в C# не используются директивы #include и файлы заголовков. Чтобы использовать в программе C# открытые типы и члены, содержащиеся в определенной сборке, вам достаточно указать ссылку на эту сборку при компиляции программы. Например, эта программа использует класс Acme.Collections.Stack из сборки acme.dll :
Для компиляции программы вам потребуется создать ссылку на сборку, содержащую класс стека, определенный в примере выше.
Программы C# можно хранить в нескольких исходных файлах. При компиляции программы C# все исходные файлы обрабатываются вместе, при этом они могут свободно ссылаться друг на друга. По сути, это аналогично тому, как если бы все исходные файлы были объединены в один большой файл перед обработкой. В C# никогда не используются опережающие объявления, так как порядок объявления, за редким исключением, не играет никакой роли. В C# нет требований объявлять только один открытый тип в одном исходном файле, а также имя исходного файла не обязано совпадать с типом, объявляемом в этом файле.
Такие организационные блоки описываются в других статьях этого обзора.
Написание безопасного и эффективного кода C#
C# позволяет создавать проверяемый безопасный код с более высокой производительностью. Если вы будете внимательно применять эти методы, у вас будет меньше сценариев, требующих небезопасного кода. Эти функции упрощают использование ссылок на типы значений в качестве аргументов метода и возвращаемых значений метода. При безопасном выполнении эти методики сводят к минимуму копирование типов значений. Используя типы значений, можно свести к минимуму число распределений и сборок мусора.
В большей части примера кода в этой статье демонстрируются функции, добавленные в C# 7.2. Чтобы использовать эти функции, убедитесь, что проект не настроен на использование более ранней версии. Дополнительные сведения см. в разделе Настройка языковой версии.
Преимущество использования типов значений заключается в том, что они часто позволяют избежать выделения памяти в кучах. Недостаток состоит в том, что они копируются по значению. Этот компромисс усложняет оптимизацию алгоритмов, работающих с большими объемами данных. Языковые функции, описываемые в этой статье, предоставляют механизмы, которые обеспечивают безопасный эффективный код с использованием ссылок на типы значений. При рациональном использовании этих функций можно свести к минимуму число операций выделения и копирования.
В статье также объясняются некоторые низкоуровневые оптимизации, которые рекомендуется использовать при запуске профилировщика и выявлении узких мест.
Эти методы поддерживают компромисс между двумя целями:
Сокращение количества выделений в куче.
Переменные, являющиеся ссылочными типами, содержат ссылку на расположение в памяти и выделяются в управляемой куче. Ссылка копируется только когда ссылочный тип передается в качестве аргумента в метод или возвращается из метода. Каждый новый объект требует новое распределение и впоследствии должен быть освобожден. Сборка мусора занимает некоторое время.
Сокращение числа копирований значений.
Переменные, которые являются типами значений, непосредственно содержат их значения, и значение обычно копируется при передаче в метод или возвращается из метода. Это поведение включает в себя копирование значения this при вызове членов типа значения. Операция копирования занимает некоторое время, в зависимости от размера типа.
В этой статье используется следующий пример концепции трехмерной структуры для объяснения этих рекомендаций:
Различные примеры использования других реализаций этой концепции.
Объявите неизменяемые структуры как readonly
Этих двух правил достаточно, чтобы убедиться, что ни один из элементов readonly struct не изменяет состояние этой структуры. Объект struct является неизменяемым. Структура Point3D может быть определена как неизменяемая, как показано в следующем примере:
Следуйте этим рекомендациям, когда планируете создать неизменяемый тип значения. Улучшения производительности являются дополнительным преимуществом. Ключевые слова readonly struct четко выражают намерение проекта.
Объявите элементы readonly для изменяемых структур.
Рассмотрим другое приложение, для которого требуется структура объемных точек, однако оно должно поддерживать изменяемость. Следующая версия структуры объемных точек добавляет модификатор readonly только к тем элементам, которые не изменяют структуру. Используйте этот пример, если проект должен поддерживать модификации структуры некоторыми членами, однако вам все равно нужны преимущества реализации через readonly для некоторых членов:
Использование инструкций ref readonly return
Тем не менее, следующее определение свойства может возвращаться по ссылке, так как возвращаемое значение является статическим элементом:
Вы не хотите, чтобы вызывающие объекты изменяли источник, поэтому следует возвращать значение через ref readonly :
Возвращение ref readonly позволяет сохранить копирование больших структур и неизменность внутренних элементов данных.
Во время вызова вызывающие объекты выбирают использовать свойство Origin как ref readonly или как значение:
С добавлением ключевого слова in C# предоставляет полный словарь для выражения намерения проекта. Если в сигнатуре метода не указан ни один из следующих модификаторов, типы значений копируются при передаче в вызываемый метод. Каждый из этих модификаторов указывает, что переменная передается по ссылке, предотвращая копирование. Каждый модификатор выражает конкретное намерение.
При добавлении модификатора in для передачи аргумента по ссылке вы объявляете о своем намерении передавать аргументы по ссылке, чтобы избежать ненужных операций копирования. Вы не собираетесь изменять объект, используемый в качестве этого аргумента.
Модификатор in также можно использовать со ссылочными типами или числовыми значениями. Однако преимущества в этих случаях минимальны (если они вообще есть).
Использование параметров in для больших структур
Ниже приведен пример метода, который вычисляет расстояние между двумя точками в трехмерном пространстве.
Необязательное использование in на сайте вызова
Пропуск модификатора in в месте вызова сообщает компилятору, что он может сделать копию аргумента по следующим причинам:
Чтобы велеть компилятору передавать аргументы, доступные только для чтения, по ссылке, укажите модификатор in для аргументов в месте вызова, как показано в следующем коде:
Избегание защитных копий
Вы видите пример программы, который демонстрирует разницу в производительности с помощью BenchmarkDotNet в наших репозиториях примеров на сайте GitHub. Он сравнивает передачу изменяемых структур по значению и по ссылке с передачей неизменяемых структур по значению и по ссылке. Быстрее всего использовать неизменяемую структуру и передачу по ссылке.
Использование типов ref struct
Использование типов nint и nuint
Целочисленные типы собственного размера — это 32-разрядные целые числа в 32-разрядном процессе или 64-разрядные целые числа в 64-разрядном процессе. Используйте их для сценариев взаимодействия, с низкоуровневыми библиотеками и для оптимизации производительности в сценариях, где часто выполняются математические операции с целыми числами.
Выводы
Использование типов значений сводит к минимуму число операций распределения:
Сравните это со ссылочными типами в таких же ситуациях:
Чтобы свести распределения к минимуму, придется пойти на компромисс. Вы копируете больше памяти, если размер struct больше, чем размер ссылки. Ссылка обычно является 64- или 32-разрядной и зависит от ЦП целевого компьютера.
Эти компромиссы обычно имеют минимальное влияние на производительность. Однако для больших структур или больших коллекций влияние на производительность возрастает. Влияние может быть большим в плотных циклах и часто используемых путях для программ.