用于对象的惯用C#虽然已注册到事件但仅进行交互

Ben*_*ary 8 c# events constructor garbage-collection

我对设计一个简单程序的方式感到不安.有一个FileParser对象具有OnFileOpened,OnLineParsedOnFileClosed事件,以及几个基于FileParser分析的文件内容创建较小文件的对象.

观察对象的对象FileParser使用FileParser其构造函数中的事件注册它们的方法.

ParsedFileFrobber(FileParser fileParser)
{
    fileParser.OnFileOpen += this.OpenNewFrobFile;
    fileParser.OnLineParsed += this.WriteFrobbedLine;
    fileParser.OnFileClose += this.CloseFrobFile;
}
Run Code Online (Sandbox Code Playgroud)

在那之后,ParsedFileFrobber只是在没有进一步明确交互的情况下继续进行.

困扰我的是主程序只分配一个ParsedFileFrobber并且基本上不使用构造函数的返回值,所以说.

var fileParser = new FileParser(myFilename);
var parsedFileFrobber = new ParsedFileFrobber(fileParser);
// No further mentions of parsedFileFrobber.
Run Code Online (Sandbox Code Playgroud)

它有效,但ReSharper抱怨这一点,这至少让我停下来思考.实际上,我甚至不需要为构造函数的结果分配一个变量,因为GC将ParsedFileFrobber通过事件处理程序引用的优点来保持活着,但是new对于我来说,裸露看起来非常错误.(它仍然可以编译并正确运行.)

var fileParser = new FileParser(myFilename);
new ParsedFileFrobber(fileParser);
Run Code Online (Sandbox Code Playgroud)

这是一个问题吗?它是反模式还是代码味?在C#中是否已经有一种惯用的方法?

谢谢!

通过有用的评论澄清:

1)为什么不颠倒这种关系?科迪格雷

啊,这个例子有点过于简单了.我实际上有一个ParsedFileFrobber,一个ParsedFileGrobber和一个ParsedFileBrobber.颠倒这种关系会使FileParser所有人都依赖于3.(而且,最初只有一个Frobber和一个Grobber,但后来需要一个Brobber,而且还有呃,Drobber等等的范围.)我猜想,这是大约的代码做预订的线路是否发生在品味的问题FileParser构造函数或在ParsedFileFrobber,ParsedFileGrobberParsedFileBrobber建设者,但我的选择是尽量保持FileParser为不可知越好.

2)为什么不将构造函数移动到静态方法(并使构造函数为私有)?汉斯帕斯特

我可以看到如何将可能不直观的用法整理到课堂的私人内部工作中,这是一个很好的建议.但是,它仍然是new对构造函数的返回值的裸引用或唯一分配引用.好吧,如果这不是一个大问题,隐藏丑陋的代码是有道理的.(作为参考,我确实使用从事件中取消订阅的方法制作了ParsedFileFrobber一个,因此可以结束擦除.)IDisposableDispose

感谢所有评论者!

Ben*_*ary 0

最后,我采用了 Hans Passant 推荐的方法:将裸露的 new 内容整理到静态方法的内部工作中。