سؤال

هل من الممكن استنساخ كائن ، عندما يكون من المعروف أن محاصر ValueType ، دون كتابة نوع معين استنساخ الرمز ؟

بعض رمز المرجعية

List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
DuplicateLastItem(values);

على partical مشكلة لدي مع قيمة كومة الافتراضي استنادا لتعليمات الجهاز.(و ايم كسول جدا لكتابة تشير typeof(الباحث) تشير typeof(التاريخ والوقت)....)

التحديث أعتقد الخلط بين نفسي (وعدد قليل من الآخرين).الحل العمل لدي ؛

List<ValueType> values = new List<ValueType> { 3, DateTime.Now, 23.4M }; 

// Clone
values.Add(values[values.Count() - 1]);

// Overwrite original
values[2] = 'p';

foreach (ValueType val in values)
   Console.WriteLine(val.ToString());
هل كانت مفيدة؟

المحلول

أنا لا أعرف إذا كان لدي تماما أسأت فهم السؤال.
تحاول أن تفعل هذا ؟

public static void Main()
{
    List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
    DuplicateLastItem(values);

    Console.WriteLine(values[2]);
    Console.WriteLine(values[3]);
    values[3] = 20;
    Console.WriteLine(values[2]);
    Console.WriteLine(values[3]);
}

static void DuplicateLastItem(List<ValueType> values2)
{
    values2.Add(values2[values2.Count - 1]);
}

نصائح أخرى

كل إحالة valuetype هو تعريف استنساخ.

تحرير:

عندما الملاكمة valuetype نسخة من valuetype سوف يكون الواردة في مثيل ReferenceType.

اعتمادا على طريقة الاستنساخ ، أنا لا أتوقع أي خلافات.

يمكنك استخدام الإختراق باستخدام Convert.ChangeType:

object x = 1;
var type = x.GetType();
var clone = Convert.ChangeType(x, type);

// Make sure it works
Assert.AreNotSame(x, clone);

والنتيجة هي نسخ من قيمة محاصر في الكائن الجديد.

لماذا تحتاج الاستنساخ رمز على أي حال ؟ أنواع القيم يجب أن عادة ما تكون ثابتة على كل حال و هذا ليس تغيير الملاكمة.ولذلك مصممة تصميما جيدا قيمة نوع لا يوجد لديه شرط الاستنساخ.

    private static T CloneUnboxed<T>(object o) where T : struct
    {
        return (T)o;
    }

    private static object CloneBoxed<T>(object o) where T : struct
    {
        return (object)(T)o;
    }

على الرغم من أنني لا سؤال الحاجة إما بالنظر إلى أن نوع القيمة يجب أن تكون ثابتة.

إذا كنت تريد يلقي الكائن ValueType ذلك لا يسبب استنساخ ؟ هذا يمكن أن ثم تكون reboxed:

int i = 3;
object b = i; // box it
ValueType c = (ValueType) b; // unbox it
object d = c; // box it, effectively creating a clone

لذا أعتقد أن علي أن أقول فعالة استنساخ هذه المنهجية:

object clone = (ValueType) boxed;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top