繁体   English   中英

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

[英]Is it possible to assign a property of a class assigning it to the instance of that class?

为了进一步解释:我有一个类让我们说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财产anInstance ,同时还指派DateTime.UtcNow_timeStamp 有可能这样做吗? 我知道通过方法或getset这样做更容易,我得到相同的结果,可能更有效,但我想这样做。 另外,我不知道这个东西是否有特定的名称,因此这个问题可能是重复的; 我突出显示这是因为我有一个循环标题的问题,但我不知道他们被称为这样,我的问题被标记为重复(不是英国本土的烧杯),这不是一个问题只要指出我们有一个答案。

无论如何,提前谢谢!

根据评论中的建议修改编辑词典

我相信你要求的是类似于VB classic的默认属性1 想象一下,C#(和.NET一般)采用了这个概念,我们被允许声明一个2

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

    public A() {}
}

对于具有自己类型属性的类来说,完全合法,并且仅针对这些默认属性引入限制以避免我要谈论的问题比禁止存在这些默认属性更糟糕3

所以你现在有了代码:

A anInstance = new A();

A aParameter = new A();

anInstance = aParameter;

流行测验 - 第3行有什么作用? 它分配了_inner吗? 它重新分配了一个anInstance吗?

VB classic通过两种不同的赋值形式解决了这个问题。 SetLet 并且它经常是bug的来源(默认情况下Option Explicit off也没有帮助)。

当.NET被设计时,C#和VB.Net的设计者都看着这个并说“不”。 您可以拥有索引器 (c#)/ 默认属性 (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经典版不完全相同。

2请注意,我们现在不能在构造函数中为它分配一个实例 - 这会导致堆栈溢出异常,因为构造A的任何实例都需要构造一个额外的A实例,这需要构造一个额外的A实例。 ..

3具体示例是具有子树的Tree类和从Tree继承并具有TreeParent属性的SubTree类。 如果那是SubTree类的“默认属性”,那么如果尝试分配子树的子树的父级,则会遇到这些相同的属性/引用分配问题。

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

你有没有想过继承?

public class A : X
{
    private DateTime _timeStamp;

    public A() : base() {}
}

A anInstance = new A();

X aParameter = new X();

anInstance = (A)aParameter;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM