关键字“行动”是什么

本文关键字:是什么 行动 关键字 | 更新日期: 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实例的工作

即使确实需要从两个不同的地方调用它,恕我直言,这种特殊场景也会调用命名方法。这样代码的可读性会比使用委托实例更易读。