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

问题描述 投票:0回答:2

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

无论如何,提前谢谢!

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

c#
2个回答
0
投票

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

//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。而且这是一个常见的错误来源(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行分别重新分配参考并重新分配属性值。

1VB.Net确实有默认属性,但正如后面所讨论的,它们与VB classic's不完全相同。

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

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

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


0
投票

你有没有想过继承?

public class A : X
{
    private DateTime _timeStamp;

    public A() : base() {}
}

A anInstance = new A();

X aParameter = new X();

anInstance = (A)aParameter;
© www.soinside.com 2019 - 2024. All rights reserved.