Microsoft .NET ****** #1

advertisement
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
Download