2013-06-15 2 views
0

Мне нужно «скопировать» объект. Я попытался использовать интерфейс IClonable, безрезультатно, и наиболее разумным решением для меня является использование небезопасного кода для создания указателя на объект, а затем запись метода, такого как Memcpy в C. Единственная проблема заключается в создании указателя на управляемый тип , Я предполагаю, что это приведет к проблемам с сборщиком мусора, но если можно использовать маршалинг или что-то, чтобы создать указатель на управляемый объект, тогда я мог бы написать такую ​​функцию, как memcpy на C, и просто скопировать мой объект. Если структуры могут быть неуправляемыми, то почему объекты не могут быть? Объект по существу является указателем структуры, поэтому теоретически он должен быть равен размеру IntPtr справа?C# Указатель на объект?

+0

Какой объект вы пытаетесь скопировать? Как вы реализовали метод 'IClonable.Clone'? Вы _call_ свой метод 'Clone()'? Вы пытаетесь скопировать/передать объект C# на программу C? –

+0

Да, конечно. Мой объект содержит объект List, который не клонируется (я думаю, это связано с тем, что интерфейс IClonable предоставляет только метод для мелкого клонирования.) – user1454902

+3

Эти идеи очень плохие. Просто создайте конструктор копирования или реализуйте 'IClonable', в любом случае это не имеет значения. Вам нужно будет написать метод, в котором вы установите каждое значение в новом объекте так, как оно есть в старом. – evanmcdonnal

ответ

3

Я решил это самостоятельно, для тех, кто сказал мою идею использования указателей, которые исходят из моего фона с помощью C ... В любом случае, используя сериализацию, этот метод сделал именно то, что мне было нужно.

public object Clone() 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(ms, this); 
      ms.Position = 0; 
      return formatter.Deserialize(ms); 
     } 
    } 
+0

Это хорошее решение для глубокой копии сложного объекта. – evanmcdonnal

+1

@user, я рад, что вы нашли решение и обратились к нему, чтобы опубликовать его здесь. Я сам использовал этот подход. Однако предположения, сделанные в вашем вопросе, указывают на то, что у вас много неправильных представлений о том, как работает управляемый язык, такой как C# (в CLR - или Java в JVM). Прежде всего, это понятие о том, что вы можете «memcopy» объекта и прийти к новому, игнорирует концепцию сбора мусора; как система GC узнает, что ей необходимо в конечном итоге освободить эту память? (и независимо от того, CLR должен знать обо всех объектах, для которых CLR работает вообще) –

Смежные вопросы