【问题标题】:Adding a value to an array element that is a reference of another object [duplicate]向作为另一个对象引用的数组元素添加值[重复]
【发布时间】:2016-02-07 18:11:04
【问题描述】:

对不起,这个问题可能以不同的形式存在,但我真的到处搜索并没有看到它。

我曾在 C++ 中工作并习惯于使用指针。我在用 C# 模拟代码替换我的逻辑时遇到问题。

这是我的 C# 代码

abstract class Parent
{

    protected virtual int foo();
}

public class Son : Parent
{
    public Parent A { get; set; }
    public Parent B { get; set; }

    protected override int foo()
    {
         return base.foo();
    }

}

public class Daughter : Parent
{
    public Parent A { get; set; }
    public Parent B { get; set; }
}

static void Main(string[] args)
{

    Son P1 = new Son();
    Parent X = new Daughter();
    Parent[] array = new Parent[10];
    array[0] = P1;
    array[1] = P1.A;
    array[2] = P1.B;   

    array[1]= X;

    //I expect P1.A to be X but it is null
}

我希望数组成为未来实例的某种持有者,这些实例将直接添加到对象字段中。

【问题讨论】:

  • 请避免重复您自己的问题。你之前已经问过这个问题了here

标签: c# arrays pointers reference


【解决方案1】:

你从来没有给 P1.A 赋值,所以它仍然是空的。 您实际上将值分配给 array[1] 两次:第一次分配 P1.A,第二次分配给 X。两个引用值之间没有关系。

您可以认为 C# 引用(例如 array[1] 或 object obj = new Object())类似于 c++ 指针。

在您的示例中,替换 .使用 ->,并尝试思考它在 c++ 中的工作方式:它在 c# 中的工作方式相同

[编辑]

在 c++ 中你会写:

Son* P1 = new Son();
Parent* X = new Parent();

Parent* array[10]; // an array of 10 pointers
//TODO: zeromemory all elements of array, c++ does't iniziatialize pointers
array[1] = P1->A;
array[1] = X;

在c#中,你可以这样写上面的代码:

Son P1 = new Son();
Parent X = new Parent();

Parent array[10]; // an array of 10 reference to Parent, c# initialize all references to null
array[1] = P1.A;
array[1] = X;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2011-08-11
    • 1970-01-01
    • 2021-12-05
    • 2019-05-03
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多