close

Вход

Забыли?

вход по аккаунту

код для вставкиСкачать
12.03.2014
Программирование
(структурное, процедурное,
объектно-ориентированное)
с использованием C++/C#
Полевой Дмитрий Валерьевич
к.т.н., доцент КиК
e-mail: [email protected]
1
12.03.2014
Выражение
• результат вычисления – значение типа T
• может содержать
– выражения (хотя бы одно)
– операторы (и их аргументы)
– скобки (для установления порядка)
• элементарные выражения
– литерал
– переменная (в т.ч. поле)
– вызов функции (возвращаемое значение)
26.02.2014
2
2
12.03.2014
Выражение (пример)
“Тестовый текст”
a = 1
Math.Abs((a + 15) / 3.14)
2 * Math.PI + f(g(y))
26.02.2014
3
3
12.03.2014
Определение
• инструкция (не является выражением)
• может содержать выражение (инициализатор)
пример:
Int32 a = 5;
выражение
Int32 b = a + 5 – f(a);
выражение
26.02.2014
4
4
12.03.2014
Область видимости (scope)
• определяет допустимость использования
имени (в т.ч. время жизни)
• задается инструкциями (блоками)
– от определения и до конца
пример:
{
переменная a определена
Int32 a = 10;
переменная a доступна
…
}
переменная a не определена
…
26.02.2014
5
5
12.03.2014
Область видимости для цикла for
• до конца инструкции (блока)
пример:
for (Int32 i = 0; i < 10; ++i)
{
переменная i доступна
…
Double x = Math.Sqrt(i);
переменная x доступна
…
}
переменные i и x не определены
…
26.02.2014
6
6
12.03.2014
Пространство имен (namespace)
• ключевые слова
namespace, using
• задает область видимости
– группирует типы
– делает (полные) имена типов уникальными
• могут быть вложенными
26.02.2014
7
7
12.03.2014
Внутри пространства имен
• другое пространство
namespace
• тип(ы)
struct
class
enum
delegate
interface
26.02.2014
8
8
12.03.2014
Вложенные пространства имен (пример)
namespace Dummy
пространство
{
namespace Inner
вложенное пространство
{
static class NamespaceTest
{
…
}
}
}
26.02.2014
9
9
12.03.2014
Пространства имен (пример)
namespace Dummy
пространство
{
тип
static class NamespaceTest
метод
{
public static void showHaHa()
{
System.Console.WriteLine("Ha-ha!");
}
}
}
26.02.2014
10
10
12.03.2014
Полное имя (пример)
static class NamespaceSample
{
public static void Main()
{
Dummy.NamespaceTest.showHaHa();
}
}
метод
пространство тип
26.02.2014
11
11
12.03.2014
using деректива и имя (пример)
using Dummy;
пространство
static class NamespaceSample
{
public static void Main()
{
NamespaceTest.showHaHa();
}
}
тип
26.02.2014
метод
12
12
12.03.2014
Поле (член, данные)
•
•
•
•
модификатор(ы)
тип
имя
[= умолчательное значение]
пример:
struct CallCounter
тип
имя
{
private static Int32 nCall_ = 0;
… модификатор
умолчательное
public Double im_ = 0.0;
значение
};
26.02.2014
13
13
12.03.2014
Модификаторы поля
• доступ имеют
public – все
protected – реализация и «наследники»
private – реализация
internal – все внутри сборки (assembly)
• static
• const, readonly
• volatile
26.02.2014
14
14
12.03.2014
Обращение к полю (доступ)
• поле – через экземпляр obj.field
пример:
CallCounter.im_ = 0.8;
• статическое поле – через имя типа T.field
пример:
s = Math.PI
* свойства и автоматические свойства
26.02.2014
15
15
12.03.2014
Тип-значение
(value type, val-type)
• имеет семантику значения
• реализуется с помощью struct
пример:
struct ComplexNumber
{
public Double re_ = 0.0;
public Double im_ = 0.0;
…
};
26.02.2014
v
re_
im_
16
16
12.03.2014
Val-type (примеры)
struct System.Int32
struct System.Double
struct System.Boolean
struct System.Char
26.02.2014
17
17
12.03.2014
Операции с экземплярами val-type
• создание
– выделяется память для всех данных
• копирование
– все данные копируются
• уничтожение
– память освобождается
26.02.2014
18
18
12.03.2014
Ссылочный-тип
(reference type, ref-type)
•
•
•
•
имеет семантику ссылки
реализуется с помощью class
реализует подсчет ссылок
данные хранятся в «куче» (heap)
26.02.2014
v
ref counter
ref
data
19
19
12.03.2014
null
• ключевое слово
• «пустая ссылка» (null-reference)
– экземпляр ref-type не ссылается ни на какой
объект
– умолчательное значение для ref-type
– не используется для val-type
* существуют nullable type
26.02.2014
20
20
12.03.2014
Ссылочный-тип (примеры)
class System.String
class System.Array
пример:
Int32[] arrA = new Int32[5];
Int32[] arrB = null;
…
arrB = arrA;
26.02.2014
21
21
12.03.2014
new
• ключевое слово (3 способа использования)
• оператор создания нового экземпляра типа T
пример:
String s = new String(“value”);
Int32 b = new Int32(); //~ Int32 b = 0;
26.02.2014
22
22
12.03.2014
Создание (ссылочный-тип)
• при создании
– объект (ссылка) создается (стек или куча)
– данные (+ счетчик) создается в куче
– счетчик ссылок устанавливается в 1
26.02.2014
v
1
ref
data
23
23
12.03.2014
Копирование (ссылочный-тип)
• при копировании (v2=v1)
– объект (ссылка) создается (стек или куча)
– копируется ссылка
– увеличивается счетчик ссылок
v1
1->2
ref
v2
data
ref
26.02.2014
24
24
12.03.2014
Уничтожение (ссылочный-тип)
• при уничтожении
– объект (ссылка) уничтожается
– уменьшается счетчик ссылок
v1
ref
2->1
v2
data
ref
26.02.2014
25
25
12.03.2014
Сборка мусора
• освобождение памяти от неиспользуемых
экземпляров
• осуществляется автоматически
• влияние пользователя ограничено
1->0
v2
data
ref
26.02.2014
26
26
12.03.2014
Метод (функция)
• модификаторы
• тип возвращаемого значения
T или void (ничего не возвращается)
• имя
• список параметров
– может быть пустым
– пары «тип значение»
– через запятую (список)
26.02.2014
27
27
12.03.2014
Модификаторы метода
• доступ имеют
public – все
protected – реализация и «наследники»
private – реализация
internal – все внутри сборки (assembly)
• static
• virtual, override, new
• extern, partial
26.02.2014
28
28
12.03.2014
Вызов метода
• вызов
– обращение (по имени) к члену-функции
– перечисление аргументов
• аргумент
– фактически передаваемое значение параметра
– определен в точке вызова
– передается в зависимости от типа параметра
26.02.2014
29
29
12.03.2014
Возвращаемое значение
• инструкция возврата значения return
• выражение
• может отсутствовать
void в качестве возвращаемого типа
return используется без выражения (return;)
return опускается
26.02.2014
30
30
12.03.2014
Метод (пример)
пустой список
public static void sayHi()
параметров
{ модификатор
тип
имя
Console.WriteLine(“Hi!”);
}
{ вызов метода без параметров
sayHi();
…
}
26.02.2014
31
31
12.03.2014
Метод с возвратом значения (пример)
private static Int32
summ(Int32 lhs, Int32 rhs)
{
список параметров
return lhs + rhs;
}
вызов метода с параметрами
Console.Write(“{0}”, summ(8, nStep));
Int32 a = 5 + summ(b, c); аргументы
(вызова)
26.02.2014
32
32
12.03.2014
Параметр (обычный)
• для передачи данных в функцию
• определяет локальную переменную
• экземпляр val-type не может быть изменен
внутри функции (копирование)
• экземпляр ref-type может быть изменен
внутри функции
• ссылка ref-type не может быть изменена
внутри функции
26.02.2014
33
33
12.03.2014
val-type параметр (пример)
using System;
static class intAsParameter
{
static public void setZero(Int32 val)
{
val = 0;
}
static public void Main()
{
Int32 a = 5;
Console.WriteLine("a = {0}", a);
setZero(a);
Console.WriteLine("after call setZero");
Console.WriteLine("a = {0}", a);
}
}
26.02.2014
34
34
12.03.2014
ref-type параметр (пример)
using System;
static class arrAsParameter
{
static private void setZero(Int32[] arr)
{
arr[0] = 0;
}
static public void Main()
{
Int32[] arrA = new Int32[] { 2, 1 };
Console.WriteLine("arrA[0] = {0}", arrA[0]);
setZero(arrA);
Console.WriteLine("after call setZero");
Console.WriteLine("arrA[0] = {0}", arrA[0]);
}
}
26.02.2014
35
35
12.03.2014
Ссылочный параметр (ref)
• для передачи данных в/из функции
• значение экземпляра может быть изменено
внутри функции
• при вызове указывать ref
• позволяет изменить состояние
– значение для val-type
– значение и ссылку для ref-type
26.02.2014
36
36
12.03.2014
Ссылочный параметр (пример)
Array.Resize<T>(ref T[], Int32)
public static void
Resize<T>(ref T[] arr, Int32 newSize)
пример
Int32[] arr = new int[10,2];
Array.Resize(ref arr, arr.Length * 2);
26.02.2014
37
37
12.03.2014
Ссылочный параметр (пример)
using System;
static class arrayResizeTest
{
public static void Main()
{
Int32[] arr = new Int32[]{0,
Console.WriteLine("length is
Array.Resize(ref arr, 5);
Console.WriteLine("length is
Array.Resize(ref arr, 1);
Console.WriteLine("length is
}
}
26.02.2014
5, 19};
{0}", arr.Length);
{0}", arr.Length);
{0}", arr.Length);
38
38
12.03.2014
Выходной параметр (out)
• для передачи данных из функции
• значение экземпляру присваивается внутри
функции
• при вызове указывать out
26.02.2014
39
39
12.03.2014
Выходной параметр (пример)
Int32.TryParse Method(String, Int32)
public static Boolean
TryParse(String s, out Int32 res)
Int32 r = 0;
String sValue = “198”;
if (Int32.TryParse(sValue, out r))
{
…
26.02.2014
40
40
12.03.2014
Статический метод
•
•
•
•
модификатор static
определен для всего типа
вызывается через имя типа T.method()
реализация может обращаться к
статическим членам
пример
Console.WriteLine(“Hi!”);
Int32.Parse(Console.ReadLine());
26.02.2014
41
41
12.03.2014
Метод (экземплярный)
• определен для экземпляра
• вызывается через экземпляр obj.method()
• реализация может обращаться к обычным и
статическим членам
пример
Int32 arr = new Int32[]{0};
Int32 len = arr.GetUpperBound(0);
26.02.2014
42
42
1/--страниц
Пожаловаться на содержимое документа