Клонирование StringBuilder
От: Аноним  
Дата: 19.01.12 11:43
Оценка:
Каким образом создать клон 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. Или через массив.

Подскажите какой метод менее ресурсоемкий?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.