Примеры Delphi и C# из жизни

Примеры программирования на языках Delphi, C#

 




Пара слов о строках | C#

Наиболее общим и употребимым типом данных для разработчика, да и пользователя, являются строки.

Но, концепция строк в C# несколько иная, чем в классических языках программирования и проистекает из полностью объектной природы языка, что может ввести в заблуждение начинающих разработчиков или «пришельцев» из другого лагеря.

Главное правило, которое необходимо помнить при работе со строками – строка на протяжении ее жизни – неизменна и все методы, изменяющие строку возвращают ее копию. Также, первый символ строки имеет нулевой индекс.

Для работы с набором строк или с часто изменяющимися строками существует специальный класс – StringBuilder, который позволяет добиться значительного прироста производительности, поскольку не требует создания копии данных для манипулирования. Естественно, что сам класс должен быть предварительно создан: sb = new StringBuilder(); Функционально – string s = s + “я строка” и sb.Append(“я строка”) идентичны.

Поскольку все классы наследуются от Object — они имеют метод .ToString(), позволяющий получить строковое представление класса. Не будет ошибкой и такое «нестандартое» использование этого метода –
	(2+2).ToString();
	12345.ToString();


Данный метод можно перекрыть, чтобы отображать необходимые данные –
    
class SomeClass {
  public override string ToString() {
    return "Что-то возвращаем.";
  }
}


При активном использовании строк в проекте, к примеру при сборке строки из различных кусков, желательно использовать StringBuilder, так как он сильно быстрее по скорости выполнения (ведь при операциях не создаются копии исходной строки).
К примеру:
System.Diagnostics.Stopwatch sw = new Stopwatch();
string s = "";
TimeSpan ts1, ts2;
StringBuilder sb = new StringBuilder();

sw.Start();
for (int i = 0; i < 15000; i++) {
    s += "test string";
}
sw.Stop();
ts1 = sw.Elapsed;
sw.Reset();
sw.Start();
for (int i = 0; i < 15000; i++) {
    sb.Append("test string");
}
sw.Stop();
ts2 = sw.Elapsed;
MessageBox.Show(ts1.ToString()+"\r\n"+ts2.ToString());

// Результат
---
00:00:05.3194252 — string

00:00:00.0019723 — StringBuilder
---


Конечно, не стоит везде и всегда гнаться за миллисекундами – конкатенация двух строк, загруженных из ресурса в самом начале работы программы с помощью StringBuilder будет выглядеть по меньшей мере странно.