Слайд 2Содержание лекции
Первое консольное приложение на C#
Объявление и инициализация переменных
Внутренние типы данных и
![Содержание лекции Первое консольное приложение на C# Объявление и инициализация переменных Внутренние](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-1.jpg)
операция «new»
Иерархия классов типов данных
Итерационные конструкции в C#
Конструкции принятия решений
Методы и модификаторы параметров
Массивы в C#
Типы структур
Типы значения и ссылочные типы
Слайд 3Первое консольное приложение на C#
Пример «Hello World»:
namespace SimpleCSharpApp
{
class Program
{
static
![Первое консольное приложение на C# Пример «Hello World»: namespace SimpleCSharpApp { class](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-2.jpg)
void Main(string [] args)
{
// Вывод простого сообщения пользователю.
Console.WriteLine("Hello World!");
// Ожидание нажатия клавиши
Console.ReadLine();
}
}
}
Слайд 4Первое консольное приложение на C#
Важное замечание:
С# является чувствительным к регистру языком программирования.
![Первое консольное приложение на C# Важное замечание: С# является чувствительным к регистру](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-3.jpg)
Следовательно, Main и main или Readline и ReadLine будут представлять собой далеко не одно и то же.
Поэтому необходимо запомнить, что все ключевые слова в С# вводятся в нижнем регистре (например, public, lock, class, dynamic), а названия пространств имен, типов и членов всегда начинаются (по соглашению) с заглавной буквы, равно как и любые вложенные в них слова (как, например, Console.WriteLine, System.Windows.Forms.MessageBox и System.Data.SqlClient).
Слайд 5Первое консольное приложение на C#
Обработка аргументов командной строки:
static void Main(string[ ] args)
![Первое консольное приложение на C# Обработка аргументов командной строки: static void Main(string[](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-4.jpg)
{
// Обработка любых входящих аргументов.
for(int i = 0; i < args.Length; i++)
Console.WriteLine ("Arg: {0}", args[i]);
Console.ReadLine();
}
Слайд 6Первое консольное приложение на C#
Класс System.Console:
![Первое консольное приложение на C# Класс System.Console:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-5.jpg)
Слайд 7Объявление и инициализация переменных
Пример:
// Локальные переменные объявляются и инициализируются
// следующим образом:
// типДанных
![Объявление и инициализация переменных Пример: // Локальные переменные объявляются и инициализируются //](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-6.jpg)
имяПеременной = начальноеЗначение;
int myInt = 0;
// Объявлять локальные переменные и присваивать им
// начальные значения можно также в двух отдельных строках.
string myString;
myString = "This is my character data";
Console.WriteLine("Your data: {0}, {1}", mylnt, myString);
// Объявление трех переменных типа bool в одной строке.
bool b1 = true, b2 = false, b3 = b1;
Слайд 8Внутренние типы данных и операция «new»
Пример:
// Использование ключевого слова
// new для
![Внутренние типы данных и операция «new» Пример: // Использование ключевого слова //](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-7.jpg)
создания переменных
bool b = new bool (); // Установка в false.
int i = new int(); // Установка в 0.
double d = new double() ; // Установка в 0.
DateTime dt = new DateTime(); // Установка в 1/1/0001 12:00:00 AM
Console.WriteLine ("{0}, {1}, {2}, {3}", b, i, d, dt);
Слайд 9Иерархия классов типов данных
Важное замечание:
Даже элементарные типы данных в .NET имеют вид
![Иерархия классов типов данных Важное замечание: Даже элементарные типы данных в .NET](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-8.jpg)
иерархии классов. Каждый из них наследуется от класса System.Object (в котором содержится набор методов, таких как ToString(), Equals())
Слайд 10Иерархия классов типов данных
Числовые типы данных:
// Минимальное значение типа int
Console.WriteLine ("Min
![Иерархия классов типов данных Числовые типы данных: // Минимальное значение типа int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-9.jpg)
of int: {0}", int.MinValue);
// Максимальное значение типа double
Console.WriteLine ("Max of double: {0}", double.MaxValue);
Слайд 11Иерархия классов типов данных
Тип System.Boolean:
Единственными значениями, которые могут присваиваться типу Boolean (bool)
![Иерархия классов типов данных Тип System.Boolean: Единственными значениями, которые могут присваиваться типу](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-10.jpg)
в C#, являются true и false
Слайд 12Иерархия классов типов данных
Тип System.Char:
string позволяет представлять непрерывный набор символов («Hello»), а
![Иерархия классов типов данных Тип System.Char: string позволяет представлять непрерывный набор символов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-11.jpg)
char – только конкретный символ в типе string (‘H’)
Пример: char myChar = ‘A’;
Слайд 13Иерархия классов типов данных
Тип System.DateTime:
// Этот конструктор принимает в качестве
// аргументов
![Иерархия классов типов данных Тип System.DateTime: // Этот конструктор принимает в качестве](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-12.jpg)
сведения о годе, месяце и дне.
DateTime dt = new DateTime (2013, 10, 17);
// Какой это день месяца?
Console.WriteLine("The day of {0} is {1}", dt.Date, dt.DayOfWeek);
Слайд 14Иерархия классов типов данных
Работа со строковыми данными:
![Иерархия классов типов данных Работа со строковыми данными:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-13.jpg)
Слайд 15Итерационные конструкции в C#
Конструкции для выполнения итераций:
Цикл for
Цикл foreach/in
Цикл while
Цикл do/while
![Итерационные конструкции в C# Конструкции для выполнения итераций: Цикл for Цикл foreach/in Цикл while Цикл do/while](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-14.jpg)
Слайд 16Итерационные конструкции в C#
Цикл for:
for(int i = 0; i < 4; i
![Итерационные конструкции в C# Цикл for: for(int i = 0; i {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-15.jpg)
+ + )
{
Console.WriteLine(“Number is: {0} “ , i) ;
}
Слайд 17Итерационные конструкции в C#
Цикл foreach:
string[ ] carTypes = {"Ford", "BMW", "Yugo", "Honda"
![Итерационные конструкции в C# Цикл foreach: string[ ] carTypes = {"Ford", "BMW",](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-16.jpg)
};
foreach (string с in carTypes)
Console.WriteLine(c);
Слайд 18Итерационные конструкции в C#
Цикл while и do/while:
string userIsDone = "";
while(userIsDone.ToLower () !=
![Итерационные конструкции в C# Цикл while и do/while: string userIsDone = "";](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-17.jpg)
"yes")
{
Console.Write("Are you done? [yes] [no]: ") ;
// запрос окончания
userIsDone = Console.ReadLine ();
Console.WriteLine ("In while loop");
}
Слайд 19Конструкции принятия решений
Конструкции:
Оператор if/else
Оператор switch
![Конструкции принятия решений Конструкции: Оператор if/else Оператор switch](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-18.jpg)
Слайд 20Конструкции принятия решений
Оператор if/else:
В отличие от языков С и C++, в С#
![Конструкции принятия решений Оператор if/else: В отличие от языков С и C++,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-19.jpg)
этот оператор может работать только с булевскими выражениями
Слайд 21Конструкции принятия решений
Оператор switch:
Console.WriteLine ("1 [C#], 2 [VB]");
Console.Write("Please pick your language
![Конструкции принятия решений Оператор switch: Console.WriteLine ("1 [C#], 2 [VB]"); Console.Write("Please pick](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-20.jpg)
preference: ");
string n= Console.ReadLine ();
switch (n)
{
case “1”: Console.WriteLine("Good choice, C# is a fine language.");
break;
case “2”: Console.WriteLine("VB: OOP, multithreading, and more!");
break;
default: Console.WriteLine("Well...good luck with that!");
break;
}
Слайд 22Методы и модификаторы параметров
Формат метода:
class Program
{
//Статические методы могут вызываться
//напрямую
![Методы и модификаторы параметров Формат метода: class Program { //Статические методы могут](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-21.jpg)
без создания экземпляра класса.
static int Add(int x, int у)
{
return x + у;
}
}
Слайд 23Методы и модификаторы параметров
![Методы и модификаторы параметров](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-22.jpg)
Слайд 24Методы и модификаторы параметров
//По умолчанию аргументы передаются по значению.
public static int
![Методы и модификаторы параметров //По умолчанию аргументы передаются по значению. public static](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-23.jpg)
Add(int x, int y) {
int ans = x + y;
х = 10000; у = 88888;
return ans; }
// Передача двух переменных по значению.
static void Main(string[] args) {
int x = 9, у = 10;
Console.WriteLine("Before call: X: {0}, Y: {1}", x, y) ; // до вызова
Console.WriteLine("Answer is: {0}", Add(x, y) ) ; // ответ
Console.WriteLine("After call: X: {0}, Y: {1}", x, y) ; // после вызова
Console.ReadLine(); }
РЕЗУЛЬТАТ:
Before call: X: 9, Y: 10
Answer is: 19
After call: X: 9, Y: 10
Слайд 25Методы и модификаторы параметров
Модификатор out:
// Выходные параметры должны предоставляться вызываемым методом.
public
![Методы и модификаторы параметров Модификатор out: // Выходные параметры должны предоставляться вызываемым](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-24.jpg)
static void Add (int x, int y, out int ans)
{ ans = x + y; }
// Присваивать первоначальное значение локальным
// переменным, используемым в качестве выходных
// параметров, не требуется, при условии, что в первый раз
// они используются в качестве выходных аргументов.
static void Main(string[] args)
{
int ans;
Add(90, 90, out ans);
Console.WriteLine("90 + 90 = {0}", ans);
Console.ReadLine();
}
Слайд 26Методы и модификаторы параметров
Модификатор ref:
// Ссылочные параметры.
public static void SwapStrings(ref string
![Методы и модификаторы параметров Модификатор ref: // Ссылочные параметры. public static void](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-25.jpg)
s1, ref string s2) {
string tempStr = s1;
s1 = s2;
s2 = tempStr; }
static void Main(string[ ] args) {
string s1 = "Flip"; string s2 = "Flop";
Console.WriteLine("Before: {0}, {1} ", s1, s2) ; //до
SwapStrings (ref s1, ref s2);
Console.WriteLine("After: {0}, [1} ", s1, s2); // после
Console.ReadLine (); }
РЕЗУЛЬТАТ:
Before: Flip, Flop
After: Flop, Flip
Слайд 27Методы и модификаторы параметров
Модификатор params:
// Возвращение среднего из некоторого количества значений double.
![Методы и модификаторы параметров Модификатор params: // Возвращение среднего из некоторого количества](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-26.jpg)
static double CalculateAverage(params double[] values)
{
// Вывод количества значений
Console.WriteLine ("You sent me {0} doubles.", values.Length);
double sum = 0;
if(values.Length == 0)
return sum;
for (int i = 0; l < values.Length; i++)
sum += values [i];
return (sum/values.Length);
}
На заметку!
Во избежание какой бы то ни было неоднозначности, в С# требуется, чтобы в любом методе поддерживался только один аргумент params, который должен быть последним в списке параметров.
Слайд 28Методы и модификаторы параметров
Перегрузка методов:
class Program
{
static void Main(string[] args) {
![Методы и модификаторы параметров Перегрузка методов: class Program { static void Main(string[]](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-27.jpg)
}
// Перегруженный метод Add() .
static int Add(int x, int y)
{ return x + y; }
static double Add(double x, double y)
{ return x + y; }
static long Add(long x, long y)
{ return x + y; }
}
Слайд 29Массивы в С#
static void SimpleArrays ()
{
// Создание и заполнение массива
![Массивы в С# static void SimpleArrays () { // Создание и заполнение](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-28.jpg)
тремя
// целочисленными значениями.
int[] myInts = new int[3];
mylnts[0] = 100;
mylnts[1] = 200;
mylnts[2] = 300;
// Отображение значений.
foreach (int i in myInts)
Console.WriteLine(i);
Console.WriteLine();
}
Слайд 30Массивы в С#
static void Arraylnitialization ()
{
// с помощью ключевого слова
![Массивы в С# static void Arraylnitialization () { // с помощью ключевого](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-29.jpg)
new.
string[] stringArray = new string[] { "one", "two", "three" };
Console.WriteLine("stringArray has {0} elements", stringArray.Length);
// без применения ключевого слова new.
bool [] boolArray = { false, false, true };
Console.WriteLine("boolArray has {0} elements", boolArray.Length);
// с указанием ключевого слова new и желаемого размера.
int[] intArray = new int[4] { 20, 22, 23, 0 };
Console.WriteLine("intArray has {0} elements", intArray.Length);
Console.WriteLine();
}
Слайд 31Массивы в С#
Передача массива в качестве аргумента:
static void PrintArray (int [] myInts)
![Массивы в С# Передача массива в качестве аргумента: static void PrintArray (int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-30.jpg)
{
for(int i = 0; i < myInts.Length; i++)
Console.WriteLine("Item {0} is {1} ", i, myInts[i]);
}
static string[] GetStringArray()
{
string[] theStrings = {"Hello", "from", "GetStringArray"};
return theStrings;
}
Слайд 33Типы структур
На заметку!
Если вы ранее занимались объектно-ориентированным программированием, можете считать структуры
![Типы структур На заметку! Если вы ранее занимались объектно-ориентированным программированием, можете считать](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-32.jpg)
"облегченными классами", поскольку они тоже предоставляют возможность определять тип, поддерживающий инкапсуляцию, но не могут применяться для построения семейства взаимосвязанных типов. Когда есть потребность в создании семейства взаимосвязанных типов через наследование, нужно применять типы классов.
В С# структуры создаются с помощью ключевого слова struct.
Слайд 34Типы структур
struct Point {
// Поля структуры.
public int X;
public int
![Типы структур struct Point { // Поля структуры. public int X; public](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-33.jpg)
Y;
// Добавление 1 к позиции (X, Y) .
public void Increment ()
{ X++; Y++; }
// Вычитание 1 из позиции (X, Y) .
public void Decrement ()
{ X--; Y—; }
// Отображение текущей позиции.
public void Display()
{ Console.WriteLine(X = {0}, Y= {1}", X, Y); }
}
Слайд 35Типы значения и ссылочные типы
// Локальные структуры извлекаются из стека
// после
![Типы значения и ссылочные типы // Локальные структуры извлекаются из стека //](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-34.jpg)
завершения метода.
static void LocalValueTypes ()
{
//В действительности int представляет
// собой структуру System.Int32.
int i = 0;
//В действительности Point представляет
// собой тип структуры.
Point p = new Point();
} // Здесь i и р изымаются из стека.
Слайд 36Типы значения и ссылочные типы
static void ValueTypeAssignment() {
Point p1 = new
![Типы значения и ссылочные типы static void ValueTypeAssignment() { Point p1 =](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-35.jpg)
Point (10, 10); Point p2 = p1;
// Вывод обеих переменных Point,
p1.Display(); p2.Display();
// Изменение значение p1.X и повторный вывод.
// Значение р2.Х не изменяется.
p1.X = 100;
Console.WriteLine("\n=> Changed p1.X\n");
p1.Display(); p2.Display(); }
РЕЗУЛЬТАТ:
X = 10, Y = 10
X = 10, Y = 10
=> Changed p1.X
X = 100, Y = 10
X = 10, Y = 10
Слайд 37Типы значения и ссылочные типы
class PointRef {
public PointRef(int XPos, int YPos)
![Типы значения и ссылочные типы class PointRef { public PointRef(int XPos, int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-36.jpg)
{ X = XPos; Y = YPos; }
}
static void ReferenceTypeAssignment () {
PointRef p1 = new PointRef (10, 10); PointRef p2 = p1;
p1.Display(); p2.Display();
p1.X = 100;
Console.WriteLine("\n=> Changed p1.X\n");
p1.Display(); p2.Display(); }
РЕЗУЛЬТАТ:
X = 10, Y = 10
X = 10, Y = 10
=> Changed p1.X
X = 100, Y = 10
X = 100, Y = 10
Слайд 38Передача ссылочных типов по значению и по ссылке
Важные отличия:
В случае передачи ссылочного
![Передача ссылочных типов по значению и по ссылке Важные отличия: В случае](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/374069/slide-37.jpg)
типа по ссылке вызывающий код может изменять значения данных состояния объекта, а также сам объект, на который указывает входная ссылка.
В случае передачи ссылочного типа по значению вызывающий код может изменять только значения данных состояния объекта, но не сам объект, на который указывает входная ссылка.