加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 传递父对象作为父对象交互的参考的做法是什么?

发布时间:2020-12-15 05:38:57 所属栏目:百科 来源:网络整理
导读:在最近我一直在做的遗留c#代码的一些代码评论中,我见过很多像这样的例子: class ManagerParentClass{ public string CustomProperty{get;set;} public void Log(string message); void DoABunchOfTasks() { new SomethingService().DoSomething(this); }}
在最近我一直在做的遗留c#代码的一些代码评论中,我见过很多像这样的例子:
class ManagerParentClass
{
    public string CustomProperty{get;set;}
    public void Log(string message);

    void DoABunchOfTasks()
    {
       new SomethingService().DoSomething(this);
    }
}

以下内容:

public class SomethingService
{
    ManagerParentClass _manager;

    void DoSomething(ManagerParentClass manager)
    {
        _manager = manager;

        // do something
        _manager.CustomProperty = "hello world";
        _manager.Log("said hello world");
    }
}

虽然这在表面上运行良好,但我担心这是一种反模式,可能会导致垃圾收集的邪恶事物.

这会破坏.Net能否正确清理父对象和子对象的能力或其他任何负面影响的世代垃圾收集器?

解决方法

哦,是的,这是一个可怕的反模式.我使用的代码库使用了很多,而且非常疯狂.

最大的进攻?违反封装以及它附带的类之间的紧密耦合:SomethingService对ManagerParentClass了解太多,而ManagerParentClass放弃了对SomethingService的控制.

两个更好的选择:

>使DoSomething()成为ManagerParentClass的实例方法,这与面向对象的基本点保持一致:数据结构带有运算符
>使SomethingService成为执行某些计算并返回值的纯方法,然后调用者可以对ManagerParentClass进行赋值

当然,这两个重构都涉及到ManagerParentClass的最终游戏变异,并且来自函数式编程角度,我会尽量避免这种情况.但是如果没有更多信息,我不能为此推荐一门课程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读