Каким образом создать клон StringBuilder наименее затратным для процессора способом?
1. Можно переопределить StringBuilderExt: StringBuilder, ICloneable
public StringBuilderExt ICloneable.Clone() // implement method
{
MemoryStream ms = new MemoryStream(); // create MemoryStream
BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone))
bf.Serialize(ms, this)
ms.Seek(0, SeekOrigin.Begin)
StringBuilderExt obj;
obj = (StringBuilderExt) bf.Deserialize(ms);
ms.Close();
return obj;
}
2. Можно вызывать стороннюю Generic функцию такого вида:
private T CreateShallowCopy<T>(T o)
{
// Поверхностное клонирование.
MethodInfo memberwiseClone = o.GetType().GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);
// Вызов метода MemberwiseClone из-под объекта o.
return (T)memberwiseClone.Invoke(o, null);
}
private T CreateDeepCopy<T>(T o)
{
// Создаем поверхостную копию.
T copy = CreateShallowCopy(o);
// Получем массив объектов FieldInfo и проходим по всем полям.
foreach (FieldInfo f in typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
// Получаем значение хранящееся в поле класса.
object original = f.GetValue(o);
// Устанавливаем значение в поле объекта copy cо значением которое будет установлено с помощью рекурсивного вызова метода.
f.SetValue(copy, CreateDeepCopy(original));
}
return copy;
}
3. Либо представленную в п.1, с копированием через MemoryStream
4. Можно создавать новый экземпляр так
StringBuilder newObj= new StringBuilder(oldObj.ToString());
5. Или через массив.
Подскажите какой метод менее ресурсоемкий?