c# record与class的区别

本文对比了C#中的record和class类型,主要关注它们的不可变性、值语义与引用语义、衍生性和默认行为,强调了record适用于不可变数据和默认方法,class则更灵活可继承
摘要由CSDN通过智能技术生成

在 C# 中,recordclass 是两种不同的类型。以下是它们之间的一些区别:

  1. 不可变性:record 是不可变的,一旦创建就不能修改其属性的值;而 class 是可变的,可以随时修改其属性的值。
record Person
{
    public string Name { get; init; }//设置成set可以修改
    public int Age { get; init; }
}

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
  1. 值语义 vs 引用语义:使用 record 声明的类型是值类型,它们在比较时会比较其属性值;而 class 声明的类型是引用类型,它们在比较时比较的是引用地址。
var person1 = new Person { Name = "Alice", Age = 30 };
var person2 = new Person { Name = "Alice", Age = 30 };
var person3 = person1;

bool isEqual1 = person1 == person2; // false
bool isEqual2 = person1 == person3; // true
  1. 衍生性:record 类型默认是密封的,即不能被继承;而 class 可以被继承。
record Person
{
    public string Name { get; init; }
    public int Age { get; init; }
}

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Employee : Person // 合法
{
    public string Department { get; set; }
}
  1. 默认行为:record 类型会自动生成适当的 EqualsGetHashCodeToString 方法,而 class 需要手动实现这些方法。
record Person
{
    public string Name { get; init; }
    public int Age { get; init; }
}

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override bool Equals(object obj)
    {
        // 实现自定义的相等性比较逻辑
    }

    public override int GetHashCode()
    {
        // 实现自定义的哈希码生成逻辑
    }

    public override string ToString()
    {
        // 实现自定义的字符串表示形式
    }
}

总的来说,record 主要用于表示不可变的数据实体,提供了更多默认行为,而 class 主要用于表示可变的对象,可以被继承和自定义。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中录制音频,可以使用 .NET Framework 提供的 System.Media 命名空间中的类。以下是一个简单的录音示例: ```csharp using System; using System.IO; using System.Media; class Program { static void Main(string[] args) { // 创建录音器对象 using (var recorder = new SoundRecorder()) { // 开始录音 recorder.Start(); Console.WriteLine("正在录音,按任意键停止录音..."); Console.ReadKey(); // 停止录音 recorder.Stop(); Console.WriteLine("录音已停止。"); // 保存录音文件 var fileName = "record.wav"; recorder.SaveToFile(fileName); Console.WriteLine($"录音文件已保存至:{Path.GetFullPath(fileName)}"); } } } // 录音器类 class SoundRecorder : IDisposable { private readonly MemoryStream _stream; private readonly SoundPlayer _player; private readonly WaveFileWriter _writer; private readonly WaveIn _waveIn; public SoundRecorder() { _stream = new MemoryStream(); _player = new SoundPlayer(_stream); _writer = new WaveFileWriter(_stream, new WaveFormat(44100, 16, 2)); _waveIn = new WaveIn(); _waveIn.DataAvailable += WaveIn_DataAvailable; } public void Start() { _waveIn.StartRecording(); } public void Stop() { _waveIn.StopRecording(); } public void SaveToFile(string fileName) { _writer.Flush(); File.WriteAllBytes(fileName, _stream.ToArray()); } private void WaveIn_DataAvailable(object sender, WaveInEventArgs e) { _writer.Write(e.Buffer, 0, e.BytesRecorded); } public void Dispose() { _waveIn.Dispose(); _writer.Dispose(); _player.Dispose(); _stream.Dispose(); } } ``` 此示例使用 WaveIn 和 WaveFileWriter 类来录制音频,并将其保存为 WAV 文件。在录音期间,可以按任意键停止录音,然后将录音文件保存到磁盘上。 值得注意的是,此示例用于演示目的,可能需要进行一些优化和错误处理。例如,当录音期间发生异常时,可能需要及时停止录音并释放资源,以避免内存泄漏等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值