Microsoft .NET Лекция 1, часть 1: Введение в .NET Меженин Михаил, кафедра "Системное программирование", ВМИ, ЮУрГУ, 2014 http://www.microsoft.com/en-us/download/details.aspx?id=39952 2 Microsoft .NET Что такое .NET Framework? – программная платформа от Microsoft – виртуальная машина (CLR) + библиотека классов (FCL) * альтернатива Java 3 Microsoft .NET Common Language Infrastructure – Common Language Infrastructure – открытый стандарт (ECMA-335), описывающий спецификации программного кода и среду его выполнения – Microsoft .NET – реализация стандарта CLI – Существуют и другие реализации CLI, например Mono и Portable.NET http://www.ecma-international.org/publications/standards/Ecma-335.htm Common Language Infrastructure Common Type System Common Language Specification Virtual Execution System Common Intermediate Language Metadata Standard Libraries 4 Как работает CLI Microsoft .NET Assembly Common Language Specification Common Type System Ресурсы (JPEG, HTML, etc.) Managed module ЯП1 Компилятор ЯП1 Код на Common Intermediate Language Metadata ЯП2 Компилятор ЯП2 Virtual Execution System JIT-компилятор Управление памятью Работа с исключениями Управление потоками Модуль безопасности Managed module Manifest Машинный код Standard Libraries XML Library Reflection Library Network Library Base Class Library Runtime Infrastructure Library … 5 Microsoft .NET Как не работает CLI Код С++ Компилятор С++ Машинный код 6 Microsoft .NET Как всё это работает Common Intermediate Language (IL) – абстрактный, платформонезависимый промежуточный язык Код С# Компилятор С# Код на Common Intermediate Language JITкомпилятор Машинный код 7 Microsoft .NET Как всё это работает Common Type System Common Type System (CTS) – стандарт, задающий правила определения типов Код VB.NET Код С# Компилятор VB.NET Компилятор С# Код на Common Intermediate Language JITкомпилятор Машинный код Язык не может содержать особенности, не поддерживаемые CTS 8 Microsoft .NET Как всё это работает Common Language Specification Common Language Specification (CLS) – минимальный набор правил, которым должен удовлетворять каждый язык Код VB.NET Код С# Компилятор VB.NET Компилятор С# Код на Common Intermediate Language JITкомпилятор Машинный код Модуль на C# может вызывать только те методы модуля на VB.NET, которые написаны в соответствии с CLS 9 Microsoft .NET CLS & CTS CTS C# CLS VB. NET 10 Microsoft .NET Языки программирования A# Eiffel JScript .NET Boo F# L# C# IronPython Nemerle C++/CLI IronRuby Oxygene Cobra IronLisp P# Component Pascal J# VB.NET 11 Microsoft .NET Как всё это работает Код VB.NET Код С# Компилятор VB.NET Компилятор С# Код на Common Intermediate Language JITкомпилятор Машинный код 12 Microsoft .NET Как всё это работает Метаданные – описание высокоуровневой структуры кода; в том числе описание типов и методов, определенных и вызываемых данным модулем Managed module Код VB.NET Компилятор VB.NET Код на Common Intermediate Language Metadata Код C# Компилятор C# JITкомпилятор Машинный код Managed module Модуль = служебный заголовок + CIL-код + метаданные 13 Microsoft .NET Как всё это работает Assembly Ресурсы (JPEG, HTML, etc.) Код VB.NET Компилятор VB.NET Managed module Manifest Код C# Компилятор C# JITкомпилятор Машинный код Managed module – Assembly – "сборка", "компонент", минимальный рабочий компонент – может быть исполняемым файлом или библиотекой; может быть несколькими файлами – помогает избавиться от DLL-hell – Манифест – метаданные о содержащихся в сборке модулях 14 Microsoft .NET Как всё это работает Virtual Execution System (VES) – виртуальная среда выполнения кода Код VB.NET Virtual Execution System Компилятор VB.NET Assembly Код С# Компилятор С# JIT-компилятор Управление памятью Работа с исключениями Управление потоками Модуль безопасности Машинный код – компиляция по мере необходимости – скомпилированные объекты кэшируются и не компилируются повторно – в .NET существует способ скомпилировать программу при ее установке 15 Microsoft .NET Как всё это работает Стандартные библиотеки – написанные в соответствии с CLS библиотеки, работа с которыми возможна из любого CLI-языка Код VB.NET Virtual Execution System Компилятор VB.NET JIT-компилятор Управление памятью Работа с исключениями Управление потоками Модуль безопасности Assembly Код С# Компилятор С# Машинный код Standard Libraries XML Library Reflection Library Network Library Base Class Library Runtime Infrastructure Library … 16 Как работает CLI Microsoft .NET Assembly Common Language Specification Common Type System Ресурсы (JPEG, HTML, etc.) Managed module ЯП1 Компилятор ЯП1 Код на Common Intermediate Language Metadata ЯП2 Компилятор ЯП2 Virtual Execution System JIT-компилятор Управление памятью Работа с исключениями Управление потоками Модуль безопасности Managed module Manifest Машинный код Standard Libraries XML Library Reflection Library Network Library Base Class Library Runtime Infrastructure Library … 17 Как работает .NET Microsoft .NET Assembly Common Language Specification Common Type System Ресурсы (JPEG, HTML, etc.) Managed module VB.NET Компилятор VB.NET Код на Common Intermediate Language Metadata C# Компилятор C# Common Language Runtime JIT-компилятор Управление памятью Работа с исключениями Управление потоками Модуль безопасности Managed module Manifest Машинный код Framework Base Library System.XML System. Reflection System.Net System System. Runtime … 18 Microsoft .NET Основные особенности – исполнение в виртуальной машине – независимость от языка – обширная библиотека встроенных классов – переносимость на другие платформы * * всё сложно 19 Microsoft .NET История .NET .NET Обновления Год 1.0 Первый релиз 2002 1.1 ASP.NET Mobile Controls 2003 2.0 CLR 2.0, шаблоны, расширение базовой библиотеки классов, поддержка 64-битных систем 2005 3.0 Windows Presentation Foundation (WPF), Windows Communications Foundation (WCF), Windows Workflow Foundation (WF), CardSpace 2006 3.5 LINQ, ADO.NET Entity Framework 2007 4.0 CLR 4.0, Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), новая модель параллельного программирования 2010 4.5 Поддержка приложений для Windows Store ("Metro") 2012 4.5.1 Поддержка приложений для Windows Phone Store, .NET Native 2013 4.5.2 Обновление ASP.NET и Windows Forms 2014 20 Microsoft .NET Лекция 1, часть 2: Введение в C# Меженин Михаил, кафедра "Системное программирование", ВМИ, ЮУрГУ, 2014 Microsoft .NET C# – строго объектно-ориентированный всё есть тип – унифицированная система типов все объекты являются наследниками Object – безопасность типов с int нельзя работать как с bool без приведения типов – автоматическое управление памятью никаких указателей, malloc() и free() 22 Microsoft .NET Первая программа using System; // Импорт пространства имен class Program { static void Main() { int x = 2 * 2; Console.WriteLine (x); } } // Определение класса // Определение метода // Конец метода // Конец класса 23 Microsoft .NET Первая программа 1.1 using System; class Program { static int Square(int n) { return n * n; } static void Main() { Console.WriteLine (Square(2)); } // определение метода // определение метода } 24 Microsoft .NET Пространства имён using System; using System.Text; namespace MyClasses { class ProgramOne {…} class ProgramTwo {…} } // импортируем вложенное пространство имен // создание пространства имен 25 Microsoft .NET Синтаксис using System; // ключевые слова class Program { static void Main() { int x = 2 * 2; Console.WriteLine (x); } } // идентификаторы // операторы // литералы /* комментарии */ /* пунктуация */ class @class {…} 26 Microsoft .NET Базовые типы class TypesExample { static void Main() { int i = 4 + 8 – 15 * 16 / 23 % 42; float f = 42.0f; double d = 42.0d; decimal m = 300.5m; bool b = true || (false && true); char c = 'c'; string s = "Hello" + " World"; object o = new SomeObject(); } } http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx 27 Преобразование типов Microsoft .NET class TypesExample { static void Main() { int i1, i2 = 1; float f1, f2 = 1.5f; i1 = f1; i1 = (int)f1; // ошибка // i1 == 1 – явное (explicit) f2 = i2; i2 = Convert.ToInt32(1.5f); // f2 == 1 – неявное (implicit) // i2 == 1 } } http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx 28 Microsoft .NET Сложные типы class SomeObject { private int myInteger; public static int LastInteger; public const int FortyTwo = 42; public int GetInteger() { return myInteger; } public SomeObject(int i) { myInteger = i; LastInteger = i; } class TypesExample { static void Main() { SomeObject so = new SomeObject(2); SomeObject so2 = new SomeObject(3); Console.WriteLine( Console.WriteLine( Console.WriteLine( Console.WriteLine( Console.WriteLine( Console.WriteLine( so.myInteger ); so.LastInteger ); SomeObject.LastInteger ); so.FortyTwo ); SomeObject.FortyTwo ); so.GetInteger() ); // // // // // // ошибка ошибка 3 ошибка 42 2 } } } 29 Microsoft .NET Сложные типы struct SomeObject { private int myInteger; public static int LastInteger; public const int FortyTwo = 42; public int GetInteger() { return myInteger; } public SomeObject(int i) { myInteger = i; LastInteger = i; } class TypesExample { static void Main() { SomeObject so = new SomeObject(2); SomeObject so2 = new SomeObject(3); Console.WriteLine( Console.WriteLine( Console.WriteLine( Console.WriteLine( Console.WriteLine( Console.WriteLine( so.myInteger ); so.LastInteger ); SomeObject.LastInteger ); so.FortyTwo ); SomeObject.FortyTwo ); so.GetInteger() ); // // // // // // ошибка ошибка 3 ошибка 42 2 } } } 30 Microsoft .NET Object using System; class Program { static void Main() { EmptyClass c = new EmptyClass(); c.ToString(); c.Equals(otherObject); c.GetType(); c.GetHashCode(); } } // // // // string bool Type int class EmptyClass { } 31 Microsoft .NET Object using System; class Program : System.Object { static void Main() { EmptyClass c = new EmptyClass(); c.ToString(); c.Equals(otherObject); c.GetType(); c.GetHashCode(); } } // // // // string bool Type int class EmptyClass : System.Object { } 32 Microsoft .NET Object using System; class Program : System.Object { static void Main() { int i; i.ToString(); i.Equals(otherObject); i.GetType(); i.GetHashCode(); } } // // // // // class System.Int32 : System.Object string bool Type int class EmptyClass : System.Object { } 33 Microsoft .NET Преобразование типов #2 class SomeObject { public int myInteger; public SomeObject(int i) { myInteger = i; } } class TypesExample { static void Main() { object o = new SomeObject(2); Console.WriteLine( o.myInteger ); Console.WriteLine( (SomeObject)o.myInteger); Console.WriteLine( ((SomeObject)o).myInteger ); if (o is SomeObject) { Console.WriteLine( (o as SomeObject).myInteger ); } } } // ошибка // ошибка // 2 // 2 34 Microsoft .NET Значимые типы Value Types – просто значение в памяти * – базовые типы int, float, string, bool, char, decimal… – struct – enum * обычно в стэке 35 Microsoft .NET Значимые типы struct Point { public int x; public int y; public Point(int nx, int ny) { x = nx; y = ny; } } … Point p1 = new Point(37,73); Point p2 = p1; p2.x = 0; p2.y = 0; Console.WriteLine( p1.x + " " + p1.y ); // ? Console.WriteLine( p2.x + " " + p2.y ); // ? 36 Microsoft .NET Значимые типы struct Point { public int x; public int y; public Point(int nx, int ny) { x = nx; y = ny; } } … p1 p2 int x = 37 int y = 73 int x = 0 int y = 0 Point p1 = new Point(37,73); Point p2 = p1; p2.x = 0; p2.y = 0; Console.WriteLine( p1.x + " " + p1.y ); // 37 73 Console.WriteLine( p2.x + " " + p2.y ); // 0 0 37 Microsoft .NET Ссылочные типы Reference Types – ссылка на объект в памяти * – экземпляры классов – string – массивы – делегаты * обычно вкуче 38 Microsoft .NET Ссылочные типы class Point { public int x; public int y; public Point(int nx, int ny) { x = nx; y = ny; } } … Point p1 = new Point(37,73); Point p2 = p1; p2.x = 0; p2.y = 0; Console.WriteLine( p1.x + " " + p1.y ); // ? Console.WriteLine( p2.x + " " + p2.y ); // ? 39 Microsoft .NET Ссылочные типы class Point { public int x; public int y; public Point(int nx, int ny) { x = nx; y = ny; } } … Point p1 = new Point(37,73); Point p2 = p1; p1 ссылка p2 метаданные int x = 0 int y = 0 ссылка p2.x = 0; p2.y = 0; Console.WriteLine( p1.x + " " + p1.y ); // 0 0 Console.WriteLine( p2.x + " " + p2.y ); // 0 0 40 Microsoft .NET null class Point { public int x; public int y; public Point(int nx, int ny) { x = nx; y = ny; } } … p1 null p2 ссылка метаданные int x = 0 int y = 0 Point p1 = new Point(37,73); Point p2 = p1; p1 = null; 41 Microsoft .NET Сборщик мусора class Point { public int x; public int y; public Point(int nx, int ny) { x = nx; y = ny; } } … p1 null p2 null метаданные int x = 0 int y = 0 Point p1 = new Point(37,73); Point p2 = p1; p1 = null; p2 = null; 42 Microsoft .NET string string s1 = "first"; string s2; s2 = s1; // s2 == ? 43 Microsoft .NET string s1 string s1 = "first"; string s2; ссылка s2 s2 = s1; // s2 == "first" метаданные "first" ссылка 44 Microsoft .NET string string s1 = "first"; string s2; s2 = s1; s2 = "second"; // s1 == ? 45 Microsoft .NET string wtf? Строки неизменяемы. При каждом изменении создается новая строка. string s1 = "first"; string s2; s2 = s1; s2 = "second"; s1 ссылка метаданные "first" s2 // s1 == "first" ссылка метаданные "second" // i.e. s2 = new string("second") 46 Microsoft .NET pass-by-value public void Do(int x) { x += 2; } … int i = 0; Do(i); Console.WriteLine(i); // ? 47 Microsoft .NET pass-by-value public void Do(int x) { x += 2; } … int i = 0; Do(i); Console.WriteLine(i); // 0 48 Microsoft .NET pass-by-value class SomeObject { public int x = 0; } public void Do(SomeObject o) { o.x += 2; } … SomeObject so = new SomeObject(); Do(so); Console.WriteLine(so.x); // ? 49 Microsoft .NET pass-by-value class SomeObject { public int x = 0; } public void Do(SomeObject o) { o.x += 2; } … SomeObject so = new SomeObject(); Do(so); Console.WriteLine(so.x); // 2 50 Microsoft .NET pass-by-value class SomeObject { public int x = 0; } public void DoNew(SomeObject o) { o = new SomeObject(); o.x = 2; } … SomeObject so = new SomeObject(); DoNew(so); Console.WriteLine(so.x); // ? 51 Microsoft .NET pass-by-value class SomeObject { public int x = 0; } public void DoNew(SomeObject o) { o = new SomeObject(); // копия ссылки указывает на новый объект o.x = 2; } … SomeObject so = new SomeObject(); DoNew(so); // передаём копию ссылки Console.WriteLine(so.x); // 0 – оригинальная ссылка // по-прежнему ссылается на старый объект 52 Microsoft .NET pass-by-value public void Do(string ns) { ns = ns + "2"; } … String s = "0"; Do(s); Console.WriteLine(s); // ? 53 Microsoft .NET pass-by-value public void Do(string ns) { ns = ns + "2"; // копия ссылки указывает на новый объект } … String s = "0"; Do(s); Console.WriteLine(s); // передаем копию ссылки // "0" – оригинальная ссылка // по-прежнему ссылается на старый объект 54 Microsoft .NET pass-by-reference public void Do(ref int x) { x += 2; } … int i = 0; Do(ref i); Console.WriteLine(i); // ? 55 Microsoft .NET pass-by-reference public void Do(ref int x) { x += 2; } … int i = 0; Do(ref i); Console.WriteLine(i); // 2 56 Microsoft .NET pass-by-reference class SomeObject { public int x = 0; } public void Do(ref SomeObject o) { o.x += 2; } … SomeObject so = new SomeObject(); Do(ref so); Console.WriteLine(so.x); // ? 57 Microsoft .NET pass-by-reference class SomeObject { public int x = 0; } public void Do(ref SomeObject o) { o.x += 2; } … SomeObject so = new SomeObject(); Do(ref so); Console.WriteLine(so.x); // 2 58 Microsoft .NET pass-by-reference class SomeObject { public int x = 0; } public void DoNew(ref SomeObject o) { o = new SomeObject(); o.x = 2; } … SomeObject so = new SomeObject(); DoNew(ref so); Console.WriteLine(so.x); // ? 59 Microsoft .NET pass-by-reference class SomeObject { public int x = 0; } public void DoNew(ref SomeObject o) { o = new SomeObject(); // изменяем оригинальную ссылку o.x = 2; } … SomeObject so = new SomeObject(); DoNew(ref so); // передаём саму ссылку Console.WriteLine(so.x); // 2 – ссылка уже на новый объект 60 Microsoft .NET pass-by-reference public void Do(ref string ns) { ns = ns + "2"; } … String s = "0"; Do(ref s); Console.WriteLine(s); // ? 61 Microsoft .NET pass-by-reference public void Do(ref string ns) { ns = ns + "2"; // изменяем оригинальную ссылку } … String s = "0"; Do(ref s); Console.WriteLine(s); // передаем ссылку // "02" – ссылка уже на новый объект 62 Microsoft .NET Операторы bool b = false; if (b == true) { Console.WriteLine("Yes"); } if (b) Console.WriteLine("Yes"); else Console.WriteLine("No"); while (b) { Console.WriteLine("Yes"); } int i; for (i = 0; i < 10; ++i) { … } for (int j = 10; ; ) Console.WriteLine(j); int k = 0; do { if (k == 99) break; else k += 1; } while (true); 63 Microsoft .NET Операторы int i = 0; switch (i) { case 0: Console.WriteLine("Zero"); break; case 1: case 2: Console.WriteLine("One or two"); break; default: Console.WriteLine("Something else"); break; } 64 Microsoft .NET Массивы int[] ints = new int[5]; ints[0] = 1; ints[1] = 2; ints[2] = 4; ints[3] = 8; ints[4] = 16; Console.WriteLine(ints[0]); char[] chars = new char[3] { 'a', 'b', 'c' }; Point points = new Point[300]; for (int i = 0; i < 300; ++i) points[i] = new Point(); 65 Microsoft .NET Массивы int[,] matrix = new int[3,3]; for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) matrix[i,j] = i * 3 + j; int[][] jagged = new int[3][]; for (int i = 0; i < jagged.Length; i++) { jagged[i] = new int[i]; for (int j = 0; j < jagged[i].Length; j++) { jagged[i][j] = i * 3 + j; } } 66 Microsoft .NET Массивы int[] arr = new int [] {0,1,2,5,7,8,11}; foreach (int i in arr) { if (i%2 == 0) Console.WriteLine("Even"); else Console.WriteLine("Odd"); } 67 Microsoft .NET var var var var var i = 0; f = 10.0f; s = "Hello"; z; // // // // int float string ошибка int[] arr = new int [] {0,1,2,5,7,8,11}; foreach (var i in arr) { if (i%2 == 0) Console.WriteLine("Even"); else Console.WriteLine("Odd"); } 68