Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于数组的混淆_C#_Arrays - Fatal编程技术网

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()(仍然复制指针…)
  • 使用取消引用运算符(不起作用…)

您需要一个复制构造函数或使ObjectBasicFeatures成为一个结构(结构是值类型,而类是引用类型) 然后你可以写:

ALLOBJECTS[1]=新的ObjectBasicFeatures(ALLOBJECTS[0])

另一个例子:

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;
    }
}