Язык программирования C#9 и платформа .NET5
// Здесь определен класс StringBuilder:using System.Text;Уникальность класса
в том, что при вызове его членов производится прямое изменение внутренних символьных данных объекта (делая его более эффективным) без получения копии данных в модифицированном формате. При создании экземпляраStringBuilderначальные значения объекта могут быть заданы через один из множества конструкторов. Если вы не знакомы с понятием конструктора, тогда пока достаточно знать только то, что конструкторы позволяют создавать объект с начальным состоянием при использовании ключевого словаStringBuilder. Взгляните на следующий пример примененияnew:StringBuilderstatic void FunWithStringBuilder(){Console.WriteLine("=> Using the StringBuilder:");StringBuilder sb = new StringBuilder("**** Fantastic Games ****");sb.Append("\n");sb.AppendLine("Half Life");sb.AppendLine("Morrowind");sb.AppendLine("Deus Ex" + "2");sb.AppendLine("System Shock");Console.WriteLine(sb.ToString());sb.Replace("2", " Invisible War");Console.WriteLine(sb.ToString());Console.WriteLine("sb has {0} chars.", sb.Length);Console.WriteLine();}Здесь создается объект
с начальным значениемStringBuilder. Как видите, можно добавлять строки в конец внутреннего буфера, а также заменять или удалять любые символы. По умолчанию"**** Fantastic Games ****"способен хранить строку только длиной 16 символов или меньше (но при необходимости будет автоматически расширяться): однако стандартное начальное значение длины можно изменить посредством дополнительного аргумента конструктора:StringBuilder// Создать экземпляр StringBuilder с исходным размером в 256 символов.StringBuilder sb = new StringBuilder("**** Fantastic Games ****", 256);При добавлении большего количества символов, чем в указанном лимите, объект
скопирует свои данные в новый экземпляр и увеличит размер буфера на заданный лимит.StringBuilderСужающие и расширяющие преобразования типов данных
Теперь, когда вы понимаете, как работать с внутренними типами данных С#, давайте рассмотрим связанную тему преобразования типов данных. Создайте новый проект консольного приложения по имени
и добавьте его в свое решение. Приведите код к следующему виду:TypeConversionsusing System;Console.WriteLine("***** Fun with type conversions *****");// Сложить две переменные типа short и вывести результат.short numb1 = 9, numb2 = 10;Console.WriteLine("{0} + {1} = {2}",numb1, numb2, Add(numb1, numb2));Console.ReadLine();static int Add(int x, int y){return x + y;}Легко заметить, что метод
ожидает передачи двух параметровAdd(). Тем не менее, в вызывающем коде ему на самом деле передаются две переменные типаint. Хотя это может выглядеть похожим на несоответствие типов данных, программа компилируется и выполняется без ошибок, возвращая ожидаемый результат 19.shortПричина, по которой компилятор считает такой код синтаксически корректным, связана с тем, что потеря данных в нем невозможна. Из-за того, что максимальное значение для типа
(32 767) гораздо меньше максимального значения для типаshort(2 147 483 647), компилятор неявно расширяет каждое значениеintдо типаshort. Формально термин расширение используется для определения неявного восходящего приведения которое не вызывает потерю данных.intНа заметку! Разрешенные расширяющие и сужающие (обсуждаются далее) преобразования, поддерживаемые для каждого типа данных С#, описаны в разделе "Type Conversion Tables in .NET" ("Таблицы преобразования типов в .NET") документации по .NET Core.
Несмотря на то что неявное расширение типов благоприятствовало в предыдущем примере, в других ситуациях оно может стать источником ошибок на этапе компиляции. Например, пусть для переменных
иnumb1установлены значения, которые (при их сложении) превышают максимальное значение типаnumb2. Кроме того, предположим, что возвращаемое значение методаshortсохраняется в новой локальной переменнойAdd(), а не напрямую выводится на консоль.shortstatic void Main(string[] args){Console.WriteLine("***** Fun with type conversions *****");<b>// Следующий код вызовет ошибку на этапе компиляции!</b>short numb1 = 30000, numb2 = 30000;short answer = Add(numb1, numb2);Console.WriteLine("{0} + {1} = {2}",numb1, numb2, answer);Console.ReadLine();}В данном случае компилятор сообщит об ошибке: