Слайд 1Системное программирование
для Microsoft.NET на языке C#
Лекция 6
Оцоков Шамиль
Алиевич,
Московский энергетический институт,
Email: otsokovShA@mpei.ru
Слайд 2Строки
Строка является объектом типа String, значением которого является текст. Текст
хранится в виде последовательной доступной только для чтения набора объектов
Char. В конце строки на языке C# отсутствует символ, заканчивающийся на NULL; поэтому строка C# может содержать любое число внедренных символов NULL ("\0"). Свойство Length строки представляет число объектов Char, содержащихся в этой строке, а не число символов Юникода.
В C# ключевое слово string является псевдонимом свойства String. Поэтому String и string эквивалентны
Слайд 3Строки
Объявление и инициализацию строк можно выполнять различными способами:
string message1;
string str
= "Пример строки";
char[] letters = { 'A', 'B', 'C' };
string
alphabet = new string(letters);
Слайд 4Строки
Над строками определены следующие операции:
присваивание (=);
конкатенация (объединение) или сцепление строк
(+);
две операции проверки эквивалентности: равно (= =) и не равно
(!=);
взятие индекса ([]).
Слайд 5Строки
Переприсваивание
Строки можно целиком переприсваивать:
string s1 = "Hello";
string s2 = s1;
Слайд 6Строки
Объединение строк
Можно объединять строки с помощью оператора +:
string s1 =
"orange";
string s2 = "red";
s1 += s2;Console.WriteLine(s1); // напечатается "orangered"
Строковые
объекты являются неизменяемыми: после создания их нельзя изменить. Все методы String и операторы C#, которые, как можно было бы представить, изменяют строку, в действительности возвращают результаты в новый строковый объект.
.
Слайд 7Строки
Постоянство строк
Строковые объекты являются неизменяемыми: после создания их нельзя изменить.
Все методы String и операторы C#, которые, как можно было
бы представить, изменяют строку, в действительности возвращают результаты в новый строковый объект.
В примере, когда содержимое строк s1 и s2 объединяется в одну строку, две исходные строки не изменяются. Оператор += создает новую строку с объединенным содержимым. Этот новый объект присваивается переменной s1, а исходный объект, который был присвоен строке s1, освобождается для сборки мусора, поскольку ни одна переменная не содержит ссылку на него.
Слайд 8Строки
Сравнения
Самый простой способ сравнения двух строк — использовать операторы ==
и !=, осуществляющие сравнение с учетом регистра:
string color1 = "red";
string
color2 = "green";
string color3 = "red";
if (color1 == color3) Console.WriteLine("Строки равны");
if (color1 != color2) Console.WriteLine("Строки не равны");
Не допускается использование >,<,>=,<= для сравнения строк. Для строковых объектов существует метод CompareTo(), возвращающий целочисленное значение, зависящее от того, что одна строка может быть меньше (<), равна (==) или больше другой (>). При сравнении строк используется значение Юникода, при этом значение строчных букв меньше, чем значение заглавных.
Слайд 9Строки
Доступ к отдельным знакам
Квадратные скобки [] служат для доступа к
отдельным знакам в объекте string, но при этом возможен доступ
только для чтения:
string str = "test";
char x = str[2]; // x = 's';
Слайд 10Строки
В C# существуют два вида строковых констант:
обычные константы, которые представляют
строку символов, заключённую в кавычки;
@-константы, заданные обычной константой c предшествующим
знаком @.
Слайд 11Строки
Обычные константы
В обычных константах некоторые символы интерпретируются особым образом. Связано
это, прежде всего, с тем, что необходимо уметь задавать в
строке непечатаемые символы, такие, как, например, символ табуляции. Возникает необходимость задавать символы их кодом – в виде escape-последовательностей. Для всех этих целей используется комбинация символов, начинающаяся символом "\" - обратная косая черта. Это так называемые Escape-последовательности
Слайд 12Строки
При этом возникают неудобства: например, при задании констант, определяющих путь
к файлу, приходится каждый раз удваивать символ обратной косой черты.
string
path2 = "C:\\Users\\Mikant\\Documents";
Слайд 13Строки
@-константы
В @-константах все символы трактуются в полном соответствии с их
изображением. Поэтому путь к файлу лучше задавать @-константой. Единственная проблема
в таких случаях: как задать символ кавычки, чтобы он не воспринимался как конец самой константы. Решением является удвоение символа.
string path1 = @"C:\Users\Mikant\Documents";
Слайд 16Строки
string s6 = «РГппУ";
Console.WriteLine(s6.ToUpper()); // Напечатается РГППУ
string s3 = "Visual
C# Express";
string s5 = s3.Replace("C#", "Basic");
Сonsole.WriteLine(s5);// напечатается "Visual Basic Express”
string
s3 = "Visual C# Express";
string s4 = s3.Substring(7, 2);
Console.WriteLine(s4);// напечатается "C#"
Слайд 17Строки
char razdelitel = ' ';
string text = "Шла Саша по
шоссе и сосала сушку";
Console.WriteLine("Исходный текст: '{0}'", text);
string[] words = text.Split(razdelitel);
Console.WriteLine("{0}
слов в тексте:", words.Length);
В качестве разделителя может выступать массив символов.
char[] delimiterChars = { ' ', ',', '.', ':', '\t' };
string text = "one\ttwo three:four,five six seven";
Console.WriteLine("Original text: '{0}'", text);
string[] words = text.Split(delimiterChars);
Console.WriteLine("{0} words in text:", words.Length);
Слайд 18Строки
Преобразование строк в другие типы
С помощью объекта Convert:
N = Convert.ToInt32(s1);
M
= Convert.ToDouble(s2);
F = Convert.ToBoolean(s3);
B = Convert.ToByte(s4);
C = Convert.ToChar(k);
s5= Convert.ToString(x);
Слайд 22Потоки
Поток - это упорядоченная последовательность байтов, которая отправляется из одного
приложения или устройства ввода в другое приложение или устройство вывода.
Потоки
- это абстракция канала передачи данных, который соединяет два устройства или приложения.
Потоки - это основное средство обмена информацией в компьютерном мире.
Есть два типа потоков - текстовые потоки и двоичные потоки.
Потоки не допускают произвольный доступ к своим данным, только последовательный.
Слайд 23Потоки
Потоки открываются до того, как мы можем начать с ними
работать, и закрываются после того, как они выполнили свою задачу.
Закрытие потока очень важно, и его нельзя упускать из виду, потому что вы рискуете потерять данные.
Основные операции с потоками
С потоками можно выполнять следующие операции: создание / открытие, чтение данных, запись данных, поиск / позиционирование, закрытие / отключение.
Создать или открыть поток означает подключить поток к источнику данных, механизму передачи данных или другому потоку. Например, когда у нас есть файловый поток, мы передаем имя файла и режим файла, в котором он должен быть открыт (чтение, запись или чтение и запись одновременно).
Слайд 24Потоки
Всегда закрывайте потоки и файлы, с которыми работаете! Если оставить
открытый поток или файл, это приведет к потере ресурсов и
может заблокировать работу других пользователей или процессов в вашей системе.
Двоичные и текстовые потоки
Бинарные потоки
Основными классами, которые мы используем для чтения и записи из двоичных потоков и в них, являются: FileStream, BinaryReader и BinaryWriter.
Слайд 25Потоки
Текстовые потоки
Текстовые потоки очень похожи на двоичные, но работают только
с текстовыми данными, а точнее с последовательностью символов (char) и
строк (string). Текстовые потоки идеально подходят для работы с текстовыми файлами. С другой стороны, это делает их непригодными для работы с любыми двоичными файлами.
Основными классами для работы с текстовыми потоками в .NET являются TextReader и TextWriter. Это абстрактные классы, и их нельзя создать. Эти классы определяют базовую функциональность для чтения и записи для классов, которые их наследуют. Их более важные методы:
- ReadLine() – reads one line of text and returns a string.
- ReadToEnd() – reads the entire stream to its end and returns a string.
- Write() – writes a string to the stream.
- WriteLine() – writes one line of text into the stream.
Слайд 26Потоки
StreamReader и StreamWriter. Они напрямую наследуют классы TextReader и TextWriter
StreamReader
или StreamWriter), но если мы хотим рассматривать его как двоичный,
мы должны читать и писать с помощью двоичного потока ( FileStream
// Create a StreamReader connected to a file
StreamReader reader = new StreamReader("test.txt");
// Read the file here …
// Close the reader resource after you've finished using it
reader.Close();
string fileName = "C:\\Temp\\work\\test.txt";
string theSamefileName = @"C:\Temp\work\test.txt";
Слайд 27Потоки
StreamReader и StreamWriter. Они напрямую наследуют классы TextReader и TextWriter
StreamReader
или StreamWriter), но если мы хотим рассматривать его как двоичный,
мы должны читать и писать с помощью двоичного потока ( FileStream
// Create a StreamReader connected to a file
StreamReader reader = new StreamReader("test.txt");
// Read the file here …
// Close the reader resource after you've finished using it
reader.Close();
string fileName = "C:\\Temp\\work\\test.txt";
string theSamefileName = @"C:\Temp\work\test.txt";
Слайд 28Потоки
Избегайте полных путей к файлам и работайте с относительными путями!
Закрывайте потоки после использования!
Чтобы избежать проблем с неправильной кодировкой файлов,
всегда проверяйте кодировку явно
Слайд 29Потоки
// Create an instance of StreamReader to read from a
file
StreamReader reader = new StreamReader("Sample.txt");
int lineNumber = 0;
// Read first
line from the text file
string line = reader.ReadLine();
// Read the other lines from the text file
while (line != null)
{
lineNumber++;
Console.WriteLine("Line {0}: {1}", lineNumber, line);
line = reader.ReadLine();
}
// Close the resource after you've finished using it
reader.Close();
Слайд 31Автоматическое закрытие потока
// Create an instance of StreamReader to
read from a file
StreamReader reader = new StreamReader("Sample.txt");
using (reader)
{
int lineNumber
= 0;
// Read first line from the text file
string line = reader.ReadLine();
// Read the other lines from the text file
while (line != null)
{
lineNumber++;
Console.WriteLine("Line {0}: {1}", lineNumber, line);
line = reader.ReadLine();
}
}
using () { … }
Слайд 32Кириллица
Encoding win1251 = Encoding.GetEncoding("Windows-1251");
StreamReader reader = new StreamReader("test.txt", win1251);
StreamReader reader
= new StreamReader("test.txt",
Encoding.GetEncoding("UTF-8"));
Если вам интересно, читать ли текстовый файл, закодированный
в кириллице, Windows-1251 или UTF-8, то на этот вопрос нет однозначного ответа.
Класс StreamWriter является частью пространства имен System.IO и используется исключительно для работы с текстовыми данными.
Слайд 33Кириллица
StreamWriter writer = new StreamWriter("test.txt",
false, Encoding.GetEncoding("Windows-1251"));
static void Main()
{
// Create a
StreamWriter instance
StreamWriter writer = new StreamWriter("numbers.txt");
// Ensure the writer will
be closed when no longer used
using(writer)
{
// Loop through the numbers from 1 to 20 and write them
for (int i = 1; i <= 20; i++)
{
writer.WriteLine(i);
}
}
}
Слайд 34Исключения
Исключение - это уведомление о том, что что-то прерывает нормальное
выполнение программы. Исключения обеспечивают парадигму программирования для обнаружения неожиданных событий
и реагирования на них. Когда возникает исключение, состояние программы сохраняется, нормальный поток прерывается, и управление передается обработчику исключения (если таковой существует в текущем контексте)
Слайд 35Исключения
Исключения являются мощным механизмом для централизованной обработки ошибок и исключительных
ситуаций.
иерархия исключений.
В ООП исключения - это классы, и их
можно наследовать для построения иерархий.
Слайд 37Исключения
try
{
// Some code that may throw an exception
}
catch (ExceptionType objectName)
{
//
Code handling an Exception
}
catch (ExceptionType objectName)
{
// Code handling an Exception
}
Слайд 38Генерация исключений
static void Main()
{
Exception e = new Exception("There was a
problem");
throw e;
}