ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

  << Предыдущий пост       Следующий пост >>  
От: inbruk
13. ноября 2010 18:30

Строки в C# неизменны в том смысле, что под них только единожды выделяется память (при создании). И потом эти строки не удлиняются, а пересоздаются в случае если нужно их удлинить. Например, когда нужно добавить к строке другую, то первая копируется в другое место в памяти с запасом равным размеру второй строки. И только после этого происходит копирование содержимого второй строки в это свободное место. Из-за этого операции приводящие к удлинению строк на C# выполняются медленно и не оптимально по памяти. Специально для таких случаев в пространстве имен System.Text, есть класс StringBuilder. Кстати, в одном из его конструкторов можно указать предположительный максимальный размер буфера памяти. Можно использовать StringBuilder и без задания максимальной длины строк, но это будет работать медленнее. Дальше идут четыре примера, как объединять строки на C#.

Пример 1. Работает медленно, текущий размер выделенной памяти больше чем в примерах 3 и 4. Лучше так не делать.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
String s1 = " go";
s1 += " go";
s1 += " go !";
s1 += " affirmative !";
Console.WriteLine(s1);

Console.ReadKey(true);
}
}
}


Пример 2. Пояснение первого примера. Работает точно также как первый пример. Обладает теми же свойствами.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
String s2 = " go";
s2 = String.Concat(s2, " go");
s2 = String.Concat(s2, " go !");
s2 = String.Concat(s2, " affirmative !");
Console.WriteLine(s2.ToString());

Console.ReadKey(true);
}
}
}



Пример 3. Работает быстрее чем 2 и 1, текущий размер выделенной памяти меньше.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
StringBuilder sb3 = new StringBuilder(23);
sb3.Append(" go");
sb3.Append(" go");
sb3.Append(" go !");
sb3.Append(" affirmative !");
Console.WriteLine( sb3.ToString() );

Console.ReadKey(true);
}
}
}


Пример 4. Работает точно также как 3. Но здесь показан более короткий и удобный синтаксис.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
StringBuilder sb4 = new StringBuilder(23);
sb4.Append(" go").Append(" go").Append(" go !").Append(" affirmative !");
Console.WriteLine( sb4.ToString() );

Console.ReadKey(true);
}
}
}

----------------------------------------------------------------------------------------------------

gurucode.ru - интересный блог о программировании на языке C# .NET Framework

Похожие записи


Вопросы на собеседовании C#, Net, ASP.NET, SQL
Продолжая тему вопросов на собеседовании. Нашел еще одну подборку. Оригинал лежит здесь . Перенес, чтобы не затерялось. Есть вполне вменяемые ответы (хотя, на некоторые вопросы ответил бы по-другому). Ответы находятся после списка вопросов, я их не менял. 23. Что такое шаблон проектирования Model/View/Controller? Как и зачем его применяют? 2...

Почему стоит знать, как правильно заряжать новый аккумулятор смартфона
Для того чтобы новый источник питания смог проработать как можно дольше, стоит знать, как заряжать новый аккумулятор телефона. Для начала сразу после покупки прочитайте инструкцию пользователя. Обычно производитель указывает в ней советы по первой зарядке и всем последующим. Если в инструкции ничего не сказано насчет первой зарядки, тогда можете воспользоваться ...

Как получить параметры командной строки под.Net ?
Парамтеры (аргументы) командной строки доступны (в консольном приложении на С#) в качествое параметров метода Main. Они представляют собой обычный массив строк. Это похоже на реализацию в C/C++, но есть отличие. В С нулевой элемент включает название исполнимого файла программы, а в C# на нулевом месте стоит первый по счету аргумент командной строки. Дальше идет пример...

Комментарии

 
kittycat 25.11.2010 2:08:07 #

Главное не злоупотреблять StringBuilder'ом. Если его не по делу много, то он может унести сознание на марс. Кстати, часто видел, как многие используют String.Format для конкатенации, например так string.Format("константа1{0}константа2{1}", first, second). Лучше такие вещи конкатом делать так String.Concat("константа1", first, "константа2", second).

kittycat 25.11.2010 2:10:58 #

Кстати, fluid-интерфейсы сейчас в моде, да

inbruk 25.11.2010 23:17:52 #

ай, ай, ай
Concat создает новую строку и выделяет память снова, а в StringBuilder ты можешь один раз память выделить и потом в ней резвиться, а про марс ты, пожалуй, прав  

Добавить комментарий




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий