Какво представляват низове в езика на дартс.

В Dart низът е подредена последователност от UTF-16 стойности, заобиколени от единични или двойни
кавички. Много хубава характеристика на езика е възможността за комбиниране на изрази в низове
чрез използване на ${expr} (съкращение за извикване на метода toString()).

// No differences between s and t
var s = "Double quoted";
var t = 'Single quoted';
// Interpolate an integer into a string
var age = 25;
var myAge = "I am $age years old";
// Expressions need '{' and '}' preceeded by $
var test = "${25.abs()}"
// This is redundant, don't do it because ${} already calls toString()
var redundant = "${25.toString()}";

Низът може да бъде единичен или многоредов. Едноредовите низове са показани по-горе с помощта на единични или
двойни кавички, а многоредовите низове са написани с помощта на тройни кавички. Те могат да бъдат полезни, когато
искате да форматирате добре кода, за да го направите по-четлив.

// Very useful for SQL queries, for example
var query = """
SELECT name, surname, age
FROM people
WHERE age >= 18
ORDER BY name DESC
""";

В Dart няма тип char, представляващ един символ, защото има само низове. Ако
искате да получите достъп до конкретен знак от низ, трябва да използвате оператора []:

final name = "Alberto";
print(name[0]); // prints "A"
print(name[2]); // prints "b";

Върнатата стойност на name[0] е низ, чиято дължина е 1. Препоръчваме ви да посетите 2

онлайн документацията на Dart за низове, която е супер полезна и пълна с примери.

var s = 'I am ' + name + ' and I am ' + (23).toString() + ' y.o.';

Можете да свързвате низове много лесно с оператора + по класическия начин, който повечето езици за програмиране поддържат. Официалните указания на Dart 3
предлагат да се предпочита използването на интерполация
за съставяне на низове, което е по-кратко и по-чисто:

var s = 'I am $name. I am ${25} years old';

В случай на низ, по-дълъг от един ред, избягвайте оператора + и предпочитайте просто прекъсване на реда.
Това е просто нещо, препоръчано от Dart поради стилистични причини, няма никакви последици за производителността
. Опитайте се да бъдете възможно най-последователни с езиковите указания!

// Ok
var s = 'I am going to the'
'second line';
// Still ok but '+' can be omitted
var s = 'I am going to the' +
'second line';

Тъй като низовете са неизменни, правенето на твърде много конкатенации с оператора + може да бъде
неефективно. В такива случаи би било по-добре, ако използвате StringBuffer, който ефективно свързва
низове. Например:

var value = "";
for(var i = 0; i < 900000; ++i) {
value += "$i ";
}

При всяко извикване на оператора + стойността се присвоява с нов екземпляр, който обединява старата
стойност и новата. С други думи, този код създава 900 000 пъти нов String обект,
по един за всяка итерация и изобщо не е оптимален. Ето как да тръгнете:

var buffer = StringBuffer();
for(var i = 0; i < 900000; ++i)
buffer.write("$i ");
var value = buffer.toString();

Това е много по-добре, защото StringBuffer не създава вътрешно нов низ при всяка итерация;
низът се създава само веднъж в момента, в който се извиква toString(). Когато трябва
да правите дълги цикли, които манипулират низове, избягвайте използването на оператора + и предпочитайте буфер. Същият
клас може да се намери и в Java и C# например.