是否可以分配一个类的属性,将其分配给该类的实例?

时间:2019-03-28 09:43:29

标签: c#

进一步说明:我有一个类,假设A,其属性类型为X;我想做的是能够实例化A并使用实例分配属性,而无需访问属性本身或使用方法,并且可能进行其他操作。像这样:

public class A 
{
    private X _inside; //it actually can be public also
    private DateTime _timeStamp;

    public A() {X = new X();}
}

A anInstance = new A();

X aParameter = new X();

anInstance = aParameter 

aParameter应该设置为_inside的{​​{1}}属性,同时还要将anInstance分配给DateTime.UtcNow。有可能这样做吗?我知道通过方法或_timeStampget这样做更容易,我会得到相同的结果并且可能会更有效,但是我想这样做。 另外,我不知道这个东西是否有特定的名称,因此这个问题可能是重复的。我强调这一点是因为我曾经有一个圆形标头问题,但我不知道它们是否被这样称呼,并且我的问题被标记为重复标本(不是英语的本地Seaker),只要指向我们,这不是问题。有一个答案。

无论如何,先谢谢!

编辑词典已按照注释中的建议进行修复

2 个答案:

答案 0 :(得分:0)

我相信您要的内容类似于VB classic的默认属性 1 。想象一下,C#(通常是.NET)采用了这一概念,并且我们可以声明一个 2

//Not legal c#
public class A 
{
    public default A _inside {get;set; }
    private DateTime _timeStamp;

    public A() {}
}

让类具有自己的类型的属性是完全合法的,并且为这些默认属性引入限制以避免我要谈论的问题比不允许这些默认属性存在更糟糕 3 < / sup>。

所以您现在有了代码:

A anInstance = new A();

A aParameter = new A();

anInstance = aParameter;

流行测验-第3行做什么?是否分配_inner?它会重新分配anInstance吗?

VB classic通过具有两种不同分配形式解决了该问题。 SetLet。而且它是错误的常见来源(Option Explicit默认情况下也无济于事)。

在设计.NET时,C#和VB.Net的设计人员都对此进行了查看并说“不”。您可以使用indexers(c#)/ default properties(VB.Net),但是它们必须具有其他参数:

public class A 
{
    private Dictionary<int,A> _inner = new Dictionary<int,A>();
    public A this[int i] {
      get { return _inner[i]; }
      set { _inner[i] = value; }
    }
    private DateTime _timeStamp;

    public A() {}
}

现在我们可以通过简单的方式消除不同的分配的歧义:

A anInstance = new A();

A aParameter = new A();

anInstance = aParameter;

anInstance[1] = aParameter;

第3行和第4行分别是重新分配参考和属性值。

1 VB.Net确实具有默认属性,但是,如稍后所述,它们与VB classic's并不完全相同。

2 请注意,我们现在无法在构造函数中为其分配实例-这将导致堆栈溢出异常,因为构造A的任何实例都需要构造A的其他实例需要构造A的其他实例,这将...

3 一个具体的示例是一个具有子树的Tree类和一个从SubTree继承并具有一个{{1 }}树的属性。如果这是Tree类的“默认属性”,则在尝试分配子树的子树的父级时,会遇到下面讨论的这些相同的属性/引用分配问题。

这基本上意味着您必须禁止声明其实际类型的默认属性以及它隐式可转换的任何类型的默认属性,包括继承层次结构中的所有类型。

答案 1 :(得分:0)

您考虑继承吗?

public class A : X
{
    private DateTime _timeStamp;

    public A() : base() {}
}

A anInstance = new A();

X aParameter = new X();

anInstance = (A)aParameter;