C# 关于数组的混淆
我正在尝试将数组的一部分复制到其他位置。这是申报单C# 关于数组的混淆,c#,arrays,C#,Arrays,我正在尝试将数组的一部分复制到其他位置。这是申报单 public ObjectBasicFeatures[] ALLOBJECTS = new ObjectBasicFeatures[150]; 当我这样做的时候 ALLOBJECTS[1]= ALLOBJECTS[0]; 对其中一个的任何更改都会导致另一个的更改 据我所知,它是将指针设置到同一地址(这是“复制”它,但不是我想要的) 如何将指针AllObject[0]上存储的内存复制到AllObject[1] 尝试过的事情: Array.
public ObjectBasicFeatures[] ALLOBJECTS = new ObjectBasicFeatures[150];
当我这样做的时候
ALLOBJECTS[1]= ALLOBJECTS[0];
对其中一个的任何更改都会导致另一个的更改
据我所知,它是将指针设置到同一地址(这是“复制”它,但不是我想要的)
如何将指针AllObject[0]上存储的内存复制到AllObject[1]
尝试过的事情:
- Array.Copy()(仍然复制指针…)
- 使用取消引用运算符(不起作用…)
class Program
{
static void Main(string[] args)
{
var o1 = new ObjectBasicFeatures();
var o2 = new ObjectBasicFeatures(o1);
System.Diagnostics.Debug.Assert(!o1.Equals(o2));
}
}
public class ObjectBasicFeatures
{
public ObjectBasicFeatures()
{
MyProperty = 0;
}
/// <summary>
/// copy constructor
/// </summary>
/// <param name="other"></param>
public ObjectBasicFeatures(ObjectBasicFeatures other)
{
MyProperty = other.MyProperty;
}
public int MyProperty { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
var o1=新的ObjectBasicFeatures();
var o2=新的ObjectBasicFeatures(o1);
System.Diagnostics.Debug.Assert(!o1.Equals(o2));
}
}
公共类ObjectBasicFeatures
{
公共对象基本特征()
{
MyProperty=0;
}
///
///复制构造函数
///
///
公共ObjectBasicFeatures(ObjectBasicFeatures其他)
{
MyProperty=other.MyProperty;
}
公共int MyProperty{get;set;}
}
希望这有帮助
如果您的类ObjutasBasic特性具有复杂的属性,则应该考虑深拷贝函数
来实现这一点。您需要创建一个构造函数,该构造函数将输入作为对象并复制其值。但这里有一个陷阱。您需要对ObjectBasicFeatures类中引用的所有类执行相同的操作,以此类推,直到叶节点。下面是我测试的一段代码 请否成员(类的直接成员)的值不会反映在其他(复制的)元素中,但在一个对象中更改level2.member的值时,两个对象中的值都会更新class Program
{
static void Main(string[] args)
{
ObjectBasicFeatures[] ALLOBJECTS = new ObjectBasicFeatures[3];
ALLOBJECTS[0] = new ObjectBasicFeatures("zero");
ALLOBJECTS[1] = new ObjectBasicFeatures("one");
ALLOBJECTS[2] = new ObjectBasicFeatures("two");
ALLOBJECTS[1] = new ObjectBasicFeatures(ALLOBJECTS[0]);
ALLOBJECTS[0].member = "Updated Value";
ALLOBJECTS[0].level2Member.member = "Updated Level 2 Value";
Console.WriteLine("At index 0 : " + ALLOBJECTS[0].member + ", Level2 : " + ALLOBJECTS[0].level2Member.member);
Console.WriteLine("At index 1 : " + ALLOBJECTS[1].member + ", Level2 : " + ALLOBJECTS[1].level2Member.member);
Console.ReadKey();
}
}
public class ObjectBasicFeatures
{
public string member;
public Level2 level2Member; // This is to demonstrate that it will be updated in both the objects
public ObjectBasicFeatures(string memberVal)
{
member = memberVal;
level2Member = new Level2("Level 2 Value");
}
/// Constructor to copy member values.
public ObjectBasicFeatures(ObjectBasicFeatures originalObject)
{
member = originalObject.member;
level2Member = originalObject.level2Member;
}
}
/// This class does not have a constructor to copy member values.
public class Level2
{
public string member;
public Level2(string memberVal)
{
member = memberVal;
}
}
这个函数的输出如下所示
我认为这就是你想要的,如果你真的需要在C#中使用指针的概念,有一种方法可以使用
不安全的代码。否则,您需要的称为深度复制或克隆。搜索iClonable、MemberwiseClone、Object.Clone。可能存在@dlatikay的重复项。在这种情况下,克隆还是深度复制更好?我看不到“确切情况”。。。ObjectBasicFeatures
类中有什么?更多信息:
class Program
{
static void Main(string[] args)
{
ObjectBasicFeatures[] ALLOBJECTS = new ObjectBasicFeatures[3];
ALLOBJECTS[0] = new ObjectBasicFeatures("zero");
ALLOBJECTS[1] = new ObjectBasicFeatures("one");
ALLOBJECTS[2] = new ObjectBasicFeatures("two");
ALLOBJECTS[1] = new ObjectBasicFeatures(ALLOBJECTS[0]);
ALLOBJECTS[0].member = "Updated Value";
ALLOBJECTS[0].level2Member.member = "Updated Level 2 Value";
Console.WriteLine("At index 0 : " + ALLOBJECTS[0].member + ", Level2 : " + ALLOBJECTS[0].level2Member.member);
Console.WriteLine("At index 1 : " + ALLOBJECTS[1].member + ", Level2 : " + ALLOBJECTS[1].level2Member.member);
Console.ReadKey();
}
}
public class ObjectBasicFeatures
{
public string member;
public Level2 level2Member; // This is to demonstrate that it will be updated in both the objects
public ObjectBasicFeatures(string memberVal)
{
member = memberVal;
level2Member = new Level2("Level 2 Value");
}
/// Constructor to copy member values.
public ObjectBasicFeatures(ObjectBasicFeatures originalObject)
{
member = originalObject.member;
level2Member = originalObject.level2Member;
}
}
/// This class does not have a constructor to copy member values.
public class Level2
{
public string member;
public Level2(string memberVal)
{
member = memberVal;
}
}