Для простых конкатенаций как:
String s = "a" + "b" + "c";
довольно бессмысленно использовать StringBuffer
- в качестве [1 110], jodonnell указал, что это будет энергично переведено в:
String s = new StringBuffer().append("a").append("b").append("c").toString();
, НО это очень непроизводительно для конкатенации строк в цикле, как:
String s = "";
for (int i = 0; i < 10; i++) {
s = s + Integer.toString(i);
}
Используя строку в этом цикле генерирует 10 промежуточных строковых объектов в памяти: "0", "01", "012" и так далее. При записи того же использования StringBuffer
Вы просто обновляете некоторый внутренний буфер StringBuffer
, и Вы не создаете те, промежуточная строка возражает, что Вам не нужно:
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb.append(i);
}
На самом деле для примера выше Вас должен использовать StringBuilder
(представленный в Java 1.5) вместо StringBuffer
- StringBuffer
, немного более тяжело, поскольку все его методы синхронизируются.
Статический ресурс не будет обновляться независимо от того, делаете ли вы это в коде или XAML. Для этого вам понадобится динамический ресурс.
В XAML:
<Grid x:Name="grid" Background="{DynamicResource Brush}"/>
В коде:
grid.SetResourceReference(Grid.BackgroundProperty, "Brush");
Имейте в виду, что DynamicResource недоступен в Silverlight; это только в WPF (Silverlight имеет только StaticResource).
Поскольку вы отметили свой вопрос как Silverlight, так и WPF, я подозреваю, что вы, возможно, ищете решение, которое работает в обоих. В этом случае вы, вероятно, захотите использовать привязку данных вместо ресурсов, поскольку вам требуется, чтобы свойство обновлялось в ответ на изменения.