C Sharp

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 00:17, 9 июня 2016.
С#
Парадигма

мультипарадигменный: объектно-ориентированный, обобщённый, процедурный, функциональный, событийный,

рефлективный
Спроектировано Андерс Хейлсберг
Печать дисциплины статическая, динамическая, строгая, утиная, вывод типов
Главная реализация
Visual C#, .NET Framework, Mono, DotGNU
Диалект
, Spec#, Polyphonic C#
Влияние
, F#, Nemerle, Vala, Windows PowerShell, Kotlin

C# — (произносится [ siː ʃɑːp ])объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

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

Переняв многое от своих предшественников — языков C++, Pascal, Модула, Smalltalk и Java — С# исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).

История

Название

Название «Си шарп» (от англ. sharp — диез) происходит от музыкальной нотации, где знак диез означает повышение соответствующего ноте звука на полутон, что аналогично названию языка C++, где «++» обозначает инкремент переменной. Название также является игрой с цепочкой C → C++ → C++++(C#), так как символ «#» можно составить из 4х знаков «+».

Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того, что знак диез ♯ не представлен на стандартной клавиатуре, знак # был выбран для представления знака диез при записи имени языка программирования. Это соглашение отражено в Спецификации Языка C# ECMA-334.

Названия языков программирования не принято переводить, поэтому язык следует называть по-английски «Си шарп».

Версии

Проект C# был начат в декабре 1998 и получил кодовое название COOL(C-style Object Oriented Language).

Версия 1.0

Версия 1.0 была анонсирована вместе с платформой .NET в июне 2000 года, тогда же появилась и первая общедоступная бета-версия; C# 1.0 окончательно вышел вместе с Microsoft Visual Studio .NET в феврале 2002 года.

Первая версия C# напоминала по своим возможностям Java 1.4, несколько их расширяя: так, в C# имелись свойства (выглядящие в коде как поля объекта, но на деле вызывающие при обращении к ним методы класса), индексаторы (подобные свойствам, но принимающие параметр как индекс массива), события, делегаты, циклы foreach, структуры, передаваемые по значению, автоматическое преобразование встроенных типов в объекты при необходимости (boxing), атрибуты, встроенные средства взаимодействия с неуправляемым кодом (DLL, COM) и прочее.

Кроме того, в C# решено было перенести некоторые возможности C++, отсутствовавшие в Java: беззнаковые типы, перегрузку операторов, передача параметров в метод по ссылке, методы с переменным числом параметров, оператор goto. Также в C# оставили ограниченную возможность работы с указателями — в местах кода, специально обозначенных словом unsafe и при указании специальной опции компилятору.

Версия 2.0

В 2005 году вышел окончательный релиз версии 2.0 C#. Она укрепила позиции этого языка программирования и окончательно убедила в его эффективности и дальнейшем развитии.

Новые возможности C# 2.0:

  • Частичные типы (разделение реализации класса более чем на один файл)
  • Обобщённые, или параметризованные типы (generics)
  • Новая форма итератора, позволяющая создавать сопрограммы с помощью ключевого слова yield, подобно Python и Ruby
  • Анонимные методы
  • Оператор '??': return obj1 ?? obj2; означает (в нотации C# 1.0) return obj1!=null ? obj1 : obj2;
  • Обнуляемые типы-значения
  • Возможность создавать хранимые процедуры, триггеры
  • Поддержка 64-разрядных вычислений

Версия 3.0

Окончательно эта версия языка вошла в Visual Studio 2008 и .NET 3.5.

Новые возможности C# 3.0:

  • Ключевые слова select, from, where, позволяющие делать запросы из XML документов, коллекций и т. п.
  • Инициализация объекта вместе с его свойствами
  • Лямбда-выражения
  • Деревья выражений
  • Вывод типов локальной переменной : var x = "hello"; вместо string x = "hello";
  • Безымянные типы
  • Методы-расширения — добавление метода в существующий класс с помощью ключевого слова this при первом параметре статической функции
  • Автоматические свойства

Версия 4.0

Окончательная версия вышла в 2010 году.

Новые возможности C# 4.0:

  • Возможность использования позднего связывания, для использования:
    • с языками с динамической типизацией (Python, Ruby)
    • с COM-объектами
    • отражения (reflection)
    • объектов с изменяемой структурой (DOM)
  • Именованные и опциональные параметры
  • Новые возможности COM interop
  • Ковариантность и контравариантность
  • Контракты в коде

Обзор языка

Типизирование

C# сильную неявную типизацию, используя ключевое слово var.

C# поддерживает логический тип bool. Такие выражение как while и if требует значение выражение true для работы блока.

C# более типобезопасен по сравнению с C++. Единственные неявные преобразования по умолчанию являются те, которые считаются безопасными, такие как расширение целых чисел.

Любые пользовательские преобразования должны быт помечены как явные или неявные.

В C# нет глобальных переменных и функций в явном виде. Все методы и члены объявлены внутри классов. Статические члены и публичные функции могу быть заменой глобальны переменным и функциям.

Методы и функции

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

Методы расширения в C# позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции или иного изменения исходного типа. Методы расширения представляют собой особую разновидность статического метода, но вызываются так же, как методы экземпляра в расширенном типе.

В C# присутствуют указатели на функции. Делегат - это тип, который представляет собой ссылки на методы с определенным списком параметров и возвращаемым типом. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и возвращаемым типом.

Свойства

Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного (private) поля. Свойства можно использовать, как если бы они были членами общих данных, но фактически они представляют собой специальные методы, называемые методами доступа.Это позволяет легко получать доступ к данным и помогает повысить безопасность и гибкость методов.

Пространства имён

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

Исключения

Функции обработки исключений на языке C# помогают обрабатывать любые непредвиденные или исключительные ситуации, происходящие при выполнении программы.При обработке исключений используются ключевые слова try, catch и finally для попыток применения действий, которые могут не достичь успеха, для обработки ошибок, если предполагается, что это может быть разумным, и для последующего освобождения ресурсов.

Полиморфизм

Виртуальные методы позволяют работать с группами связанных объектов универсальным способом.

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

  • переопределение виртуальных членов в базовом классе
  • наследование метода ближайшего базового класса без переопределения
  • определение новой, невиртуальной реализации тех членов, которые скрывают реализации базового класса

Типы значений и ссылочные типы

В отличие от некоторых языков программирования, C # имеет две разновидности типов данных: для значения и для ссылки. Если производительность приложения имеет существенное значение или есть заинтересованность в том, как C# управляет данными и памятью, важно знать различия между этими типами. Если в объявлении переменной используется один из основных встроенных типов данных или определенная пользователем структура данных, значит мы имеем дело с типом значения. Исключение составляет тип данных string, который является ссылочным типом. Тип значения хранит свое содержимое в памяти, выделенной в стеке.

Упаковка и распаковка

Упаковкой называется процесс преобразования типа значения в ссылочный тип. Для упаковки переменной необходимо создать ссылочную переменную, указывающую на новую копию в куче. Ссылочная переменная является объектом, следовательно для нее можно использовать все методы, наследуемые каждым объектом, например ToString().

Примеры программ

Консольная программа. Печать "Hello, World!":

using System;

namespace Example
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello World!");
            Console.ReadKey();
        }
    }
}

Сортировка перемешиванием:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SortLab
{
    class Program
    {

        static void Main()
        {
            Sort(); 
        }

        static void Sort()
        {
            
            int[] myint = { 99,88,77,66,55,44,33,22,11,8,5,3,1};

            WriteArray(myint);
            ShakerSort(myint);
            WriteArray(myint);

            Console.ReadLine();
        }

        static void ShakerSort(int[] myint)
        {
            int right = 0,
				left = myint.Length-1,
				count = 0;

			while (right <= left)
			{
				for (int i = right; i < left; i++)
				{
					count++;
					if (myint[i] > myint[i + 1]) 
						Swap(myint, i, i+1);
					else if (right == i)
						right++;
				}
				left--;

				for (int i = left; i > right; i--)
				{
					count++;
					if (myint[i-1] > myint[i]) 
						Swap(myint, i-1, i);
					else if (i == left)
						left--;
				}
				right++;
			}
        }
        static void Swap(int[] myint, int i, int j)
        {
            int glass;
            glass = myint[i];
            myint[i] = myint[j];
            myint[j] = glass;
        }
        static void WriteArray(int[] a)
        {
            foreach (int i in a)
                Console.Write("{0}|", i);
            Console.WriteLine("\n\n\n");
        }
    }
}

Литература

Ссылки

  1. Руководство по программированию на C#
  2. Язык C# (инструкции по C#)
  3. Практическое руководство. Создание приложений Windows Forms на C#