无法在主程序中访问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(""); } } }
额外优化建议
- 释放流资源:
Mp3Reader中的_stream未被释放,建议实现IDisposable接口,避免资源泄漏。 - 初始化字符串属性:
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
相关产品推荐
相关产品推荐

