关键字“行动”是什么
本文关键字:是什么 行动 关键字 | 更新日期: 2023-09-27 18:33:41
在您的代码中,当您打开FileMp3Reader
时,使用单词 Action
,然后使用 Lambda 表达式(一种方法)将其放入其中。
关键字Action
什么?在file.Create
方法中正在做什么?
var mp3Path = @"C:'Users'ronnie'Desktop'mp3'dotnetrocks_0717_alan_dahl_imagethink.mp3";
int splitLength = 120;
var mp3Dir = Path.GetDirectoryName(mp3Path);
var mp3File = Path.GetFileName(mp3Path);
var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path));
Directory.CreateDirectory(splitDir);
int splitI = 0;
int secsOffset = 0;
using (var reader = new Mp3FileReader(mp3Path))
{
FileStream writer = null;
Action createWriter = new Action(() => {
writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
});
Mp3Frame frame;
while ((frame = reader.ReadNextFrame()) != null)
{
if (writer == null) createWriter();
if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength)
{
writer.Dispose();
createWriter();
secsOffset = (int)reader.CurrentTime.TotalSeconds;
}
writer.Write(frame.RawData, 0, frame.RawData.Length);
}
if(writer != null) writer.Dispose();
}
如注释中所述,此处Action
是委托类型。考虑到它在变量声明中的位置,许多读者可能已经从上下文中推断出这一点。:)
File.Create()
方法中的代码只是根据splitI
索引生成一个新文件名。
具有讽刺意味的是,在这种特殊情况下,使用Action
是多余的。代码确实不应该以这种方式编写,因为委托只会使其更难阅读。更好的版本如下所示:
using (var reader = new Mp3FileReader(mp3Path))
{
FileStream writer = null;
try
{
Mp3Frame frame;
while ((frame = reader.ReadNextFrame()) != null)
{
if (writer != null &&
(int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength)
{
writer.Dispose();
writer = null;
secsOffset = (int)reader.CurrentTime.TotalSeconds;
}
if (writer == null)
writer = File.Create(Path.Combine(splitDir,
Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
writer.Write(frame.RawData, 0, frame.RawData.Length);
}
}
finally
{
if(writer != null) writer.Dispose();
}
}
这样,只需在一个位置创建新FileStream
实例的工作
即使确实需要从两个不同的地方调用它,恕我直言,这种特殊场景也会调用命名方法。这样代码的可读性会比使用委托实例更易读。