You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在主程序中访问GetTag()返回的Mp3Tag对象问题咨询

问题:无法在主程序中访问Mp3Tag对象的属性

我尝试读取目录中MP3文件的ID3标签,找到了一段在线代码并试图理解。大部分逻辑都能看懂,但GetTag()方法创建并返回Mp3Tag对象后,主程序里无法访问该对象的属性。在GetTag()内部直接打印tag的属性能正常输出,但主程序调用tag2.GetTag()后,获取不到tag.Title等属性。

相关代码

Mp3Reader类

public class Mp3Reader
{
    private string _fileName;
    private Stream _stream;
    private byte[] data;
    private const int SIZE = 128;

    public Mp3Reader(string fileName)
    {
        _fileName = fileName;
        _stream = new FileStream(_fileName, FileMode.Open, FileAccess.Read);
    }

    public Mp3Tag GetTag()
    {
        Mp3Tag tag = new Mp3Tag();
        data = new byte[SIZE];
        _stream.Seek(-128, SeekOrigin.End);
        _stream.Read(data, 0, SIZE);
        //_stream.Close();
        byte b1 = data[0];
        byte b2 = data[1];
        byte b3 = data[2];

        if ((Convert.ToChar(b1) != 'T') || (Convert.ToChar(b2) != 'A') || (Convert.ToChar(b3) != 'G'))
        {
            throw new Exception("This File is NOT a MP3 file with ID3 v1");

        }

        for (int i = 3; i < 33; i++)
        {
            if (data[i] != 0)
                tag.Title += Convert.ToChar(data[i]);
        }
        for (int i = 33; i < 63; i++)
        {
            if (data[i] != 0)
                tag.Artist += Convert.ToChar(data[i]);
        }
        for (int i = 63; i < 93; i++)
        {
            if (data[i] != 0)
                tag.Album += Convert.ToChar(data[i]);
        }
        for (int i = 93; i < 97; i++)
        {
            if (data[i] != 0)
                tag.Year += Convert.ToChar(data[i]);
        }
        for (int i = 97; i < 127; i++)
        {
            if (data[i] != 0)
                tag.Comment += Convert.ToChar(data[i]);
        }
        tag.Genere = data[127].ToString();
        
        return tag;
    }
}

Main方法

static void Main(string[] args)
{
    string folder = @"D:\\508-507-2209 (2017)";
    
    var files = Directory.GetFiles(folder);
    foreach(var val in files)
    {
        Mp3Reader tag2 = new Mp3Reader(val);
        tag2.GetTag();
        Console.WriteLine("");
    }
}

Mp3Tag类

public class Mp3Tag
{
    public string Title { get; set; }
    public string Artist { get; set; }
    public string Album { get; set; }
    public string Year { get; set; }
    public string Genere { get; set; }
    public string Comment { get; set; }
}

问题原因及解决方法

问题核心是主程序没有接收GetTag()方法返回的Mp3Tag对象。你只是调用了tag2.GetTag(),但未将返回的对象保存到变量中,因此无法访问其属性。修改Main方法,接收返回对象即可:

static void Main(string[] args)
{
    string folder = @"D:\\508-507-2209 (2017)";
    
    var files = Directory.GetFiles(folder);
    foreach(var val in files)
    {
        try
        {
            Mp3Reader tag2 = new Mp3Reader(val);
            // 接收GetTag()返回的Mp3Tag对象
            Mp3Tag mp3Tag = tag2.GetTag();
            // 现在可以正常访问属性
            Console.WriteLine($"文件: {val}");
            Console.WriteLine($"标题: {mp3Tag.Title}");
            Console.WriteLine($"艺术家: {mp3Tag.Artist}");
            Console.WriteLine($"专辑: {mp3Tag.Album}");
            Console.WriteLine($"年份: {mp3Tag.Year}");
            Console.WriteLine($"评论: {mp3Tag.Comment}");
            Console.WriteLine($"流派: {mp3Tag.Genere}");
            Console.WriteLine("");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"处理文件 {val} 出错: {ex.Message}");
            Console.WriteLine("");
        }
    }
}

额外优化建议

  1. 释放流资源:Mp3Reader中的_stream未被释放,建议实现IDisposable接口,避免资源泄漏。
  2. 初始化字符串属性:Mp3Tag的属性默认值为null,直接+=会抛出空引用异常,可在类中初始化属性为空字符串:
public class Mp3Tag
{
    public string Title { get; set; } = string.Empty;
    public string Artist { get; set; } = string.Empty;
    public string Album { get; set; } = string.Empty;
    public string Year { get; set; } = string.Empty;
    public string Genere { get; set; } = string.Empty;
    public string Comment { get; set; } = string.Empty;
}

内容的提问来源于stack exchange,提问作者Daqid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:09:30