Иногда бывает удобно создать две функции, которые делают одно и то же, но получают разные параметры. Такая задача особенно часто возникает для конструкторов, когда существует несколько способов создания нового экземпляра.
class Point
Иногда бывает удобно создать две функции, которые делают одно и то же, но получают разные параметры. Такая задача особенно часто возникает для конструкторов, когда существует несколько способов создания нового экземпляра.
class Point
Использовать две функции класса для чтения переменных не всегда удобно. Было бы неплохо получить оба значения при вызове одной функции. Впрочем, функция обладает лишь одним возвращаемым значением.
Решение проблемы заключается в передаче параметров по ссылке (с ключевым словом ref). В этом случае переданные параметры можно модифицировать в функции класса:
Рассмотренный выше конструктор Point() является примером функции класса (member function) — фрагмента кода, вызываемого для экземпляра объекта. Конструкторы вызываются автоматически только при создании экземпляра оператором new.
Остальные функции класса могут быть объявлены следующим образом:
Классы — это «сердце» любого приложения в объектно-ориентированном языке. Данная глава состоит из нескольких разделов. В первом разделе описаны некоторые часто используемые концепции C#. Материал последующих разделов встречается на практике несколько реже (в зависимости от того, какие программы вы пишете).
У последнего примера имеется недостаток — вызывающая сторона не может определить причину исключения при вызове DoAverage() на основании одного типа исключения. Чтобы узнать, что исключение произошло из-за нулевого значения переменной count, в тексте сообщения приходится искать строку "Count is zero".
Иногда при возникновении исключения бывает трудно сделать что-либо осмысленное — исключение должно быть обработано вызывающей функцией. Существует три основных сценария: игнорирование, промежуточная обработка и возврат дополнительной информации.
Все классы исключений C# являются производными от класса Exception, который является частью Common Language Runtime[1]. При возникновении исключения блок catch выбирается среди подходящих блоков, для чего тип исключения сравнивается с типом, указанным в блоке. Блокам catch с точным совпадением типа отдается предпочтение перед более общими исключениями. Вернемся к нашему примеру:
Обработка исключений требует несколько специфической организации программного кода. Фрагменты, которые могут инициировать исключения, помещаются в блок try, а код обработки исключений находится в блоке catch. Рассмотрим пример:
using System;
Команды C# аналогичны командам C++ за некоторыми исключениями, уменьшающими вероятность ошибки. Имеется и несколько новых команд. Команда foreach используется для перебора элементов массивов и коллекций. Команда lock реализует механизм взаимного исключения в многопоточных сценариях, а команды checked и unchecked управляют проверкой переполнения в математических операциях и преобразованиях.
В C# поддерживается стандартный набор типов данных. Для каждого типа данных, поддерживаемого C#, существует соответствующий тип .NET Common Language Runtime. Например, тип int в C# соответствует типу System.Int32 времени выполнения. В большинстве случаев вместо типа int можно указывать System.Int32, однако подобные замены не рекомендуются, поскольку это усложняет чтение программы.