Ben*_*ary 8 c# events constructor garbage-collection
我对设计一个简单程序的方式感到不安.有一个FileParser对象具有OnFileOpened,OnLineParsed和OnFileClosed事件,以及几个基于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,ParsedFileGrobber和ParsedFileBrobber建设者,但我的选择是尽量保持FileParser为不可知越好.
2)为什么不将构造函数移动到静态方法(并使构造函数为私有)?汉斯帕斯特
我可以看到如何将可能不直观的用法整理到课堂的私人内部工作中,这是一个很好的建议.但是,它仍然是new对构造函数的返回值的裸引用或唯一分配引用.好吧,如果这不是一个大问题,隐藏丑陋的代码是有道理的.(作为参考,我确实使用从事件中取消订阅的方法制作了ParsedFileFrobber一个,因此可以结束擦除.)IDisposableDispose
感谢所有评论者!