C# 通过考试是一种不好的做法吗;这";作为其自身构造函数中的参数?

C# 通过考试是一种不好的做法吗;这";作为其自身构造函数中的参数?,c#,.net,C#,.net,我有一个BdlTabItem接收类型为dockabluesercontrol的参数,我想知道在构造函数完成之前,使用uc.TabItem=this和new bdldlockableewindow(this)在两者之间创建循环引用是否是一种不好的做法 我知道,对于非托管本机代码(C++),这种行为被认为是非常糟糕的。所以,即使我没有任何警告或错误,我在这里问我是否应该这样做 public BdlTabItem(BdlTabControl parent, DockableUserControl uc

我有一个
BdlTabItem
接收类型为
dockabluesercontrol
的参数,我想知道在构造函数完成之前,使用
uc.TabItem=this
new bdldlockableewindow(this)
在两者之间创建循环引用是否是一种不好的做法

我知道,对于非托管本机代码(C++),这种行为被认为是非常糟糕的。所以,即使我没有任何警告或错误,我在这里问我是否应该这样做

public BdlTabItem(BdlTabControl parent, DockableUserControl uc, string title)
    {
        TabControlParent = parent;
        UserControl = uc;
        WindowParent = new BdlDockableWindow(this);

        this.Content = UserControl;

        UserControl.TabItem = this;
    }

这是可以接受的,但也提出了一些问题。为什么选项卡项实例化了一个新的
WindowParent
,但父选项卡控件没有对它的引用?或者为什么窗口父对象不是传入的用户控件上的属性?似乎这种行为应该发生在其他地方。

请参阅我很久以前写的一篇关于这个主题的博文。@Kilouco:在大多数实际情况下,这种方法应该没有问题。“我知道这种行为在C++中甚至是不可能的。”。。。我仍然对人们“知道”的错误事实感到惊讶。当然,C++中有一个区别…构造中的对象具有构造函数正在运行的类型的动态类型,而不是最终派生最多的类型。但是,在C++构造过程中,泄漏<代码>这个<代码>是很可能的。我的错。自从我停止C++编程以来,已经有很多年了。我会编辑的。也许在这里使用工厂模式会更好?我真的需要所有东西都连接起来,这样我就可以在这个逻辑树上的任何地方拥有引用。@Kilouco拥有引用是可以的,但是拥有需要引用的东西同时负责对象的实例化有点可疑。让一个选项卡项实例化一个窗口是很奇怪的。我可以推荐吗?您可以将父窗口作为用户控件的一个属性(如果它属于父窗口,那么它似乎属于父窗口)。然后,只需使用用户控件在内部引用窗口,或者在构造函数中,将tabitem上的属性设置为用户控件上的属性。您不一定需要将需要访问的所有内容直接传递给构造函数,它们也可以是传递给构造函数的对象的属性。我试图实现的是一个“BdlTabItem”,它实际上包含一个“tabItem”和一个窗口,因为我希望能够替换它(将tabItem转换为窗口,反之亦然)。这就是我这样做的原因。我建议添加一些上下文和调用代码,并在代码审阅中发布。我认为您将在那里获得更深入的反馈。请确保提供足够的代码和上下文。