结构体构造函数_C# 中的只读结构体(readonly struct)

本文介绍了C# 7.2引入的只读结构体(readonly struct)特性,用于创建不可变的值类型。只读结构体要求所有属性和字段必须是只读的,防止意外修改。通过使用readonly关键字,可以提高代码的意图明确性和安全性。正确初始化只读结构体的方式是通过参数化构造函数。
摘要由CSDN通过智能技术生成
翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》

在本文中,我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct

任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论:

public struct Person
{
    
    public string Name {
     get; set; }

    public string Surname {
     get; set; }

    public int Age {
     get; set; }

    public Person(string name, string surname, int age)
    {
    
        Name = name;
        Surname = surname;
        Age = age;
    }

    public void Replace(Person other)
    {
    
        this = other;
    }
}

如您所见,所有属性都可以公开访问和修改。更糟糕的是,我们甚至可以访问 this (通过调用 Replace 方法),将其更改为同一结构体类型的另一个实例。
这就是 readonly 关键字出现的原因。如果(仅)在结构体的定义中添加它,如下所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux 内核,`struct file_operations` 是一个非常重要的结构体,用于定义文件操作的函数指针。下面是各个成员的具体定义: 1. `struct module *owner`:指向拥有这个结构体的模块的指针。 2. `loff_t (*llseek) (struct file *, loff_t, int)`:定义了文件定位的函数指针,用于在文件寻找一个指定的位置。这个函数的第一个参数是指向文件对象的指针,第二个参数是要定位的文件偏移量,第三个参数是定位的方式。 3. `ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)`:定义了文件读取的函数指针,用于从文件读取数据。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向用户空间缓冲区的指针,第三个参数是要读取的字节数,第四个参数是读取的起始位置。 4. `ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)`:定义了文件写入的函数指针,用于向文件写入数据。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向用户空间缓冲区的指针,第三个参数是要写入的字节数,第四个参数是写入的起始位置。 5. `ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t)`:定义了异步文件读取的函数指针,用于从文件异步读取数据。这个函数的第一个参数是指向异步 I/O 控制块的指针,第二个参数是指向一个 iovec 结构体数组的指针,每个结构体描述了一个缓冲区,第三个参数是读取的字节数,第四个参数是读取的起始位置。 6. `ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t)`:定义了异步文件写入的函数指针,用于向文件异步写入数据。这个函数的参数和 `aio_read` 相同。 7. `int (*readdir) (struct file *, void *, filldir_t)`:定义了目录读取的函数指针,用于读取目录的文件列表。这个函数的第一个参数是指向目录文件对象的指针,第二个参数是指向一个目录项结构体的指针,第三个参数是一个函数指针,用于填充目录项结构体。 8. `unsigned int (*poll) (struct file *, struct poll_table_struct *)`:定义了文件的 poll 函数指针,用于检查文件描述符是否可以进行读取或写入操作。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向 poll_table_struct 结构体的指针,用于注册等待事件。 9. `long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long)`:定义了文件的非阻塞 I/O 控制函数指针,用于控制和查询设备的状态。这个函数的第一个参数是指向文件对象的指针,第二个参数是 ioctl 命令,第三个参数是 ioctl 参数。 10. `long (*compat_ioctl) (struct file *, unsigned int, unsigned long)`:定义了文件的兼容性非阻塞 I/O 控制函数指针,用于支持旧版本的 ioctl 命令。这个函数的参数和 `unlocked_ioctl` 相同。 11. `int (*mmap) (struct file *, struct vm_area_struct *)`:定义了文件的内存映射函数指针,用于将文件映射到进程的虚拟内存空间。这个函数的第一个参数是指向文件对象的指针,第二个参数是指向 vm_area_struct 结构体的指针,用于描述映射的内存区域。 12. `int (*open) (struct inode *, struct file *)`:定义了文件的打开函数指针,用于打开文件并返回文件对象。这个函数的第一个参数是指向 inode 结构体的指针,第二个参数是指向文件对象的指针。 13. `int (*flush) (struct file *, fl_owner_t id)`:定义了文件的刷新函数指针,用于刷新文件的缓存数据。这个函数的第一个参数是指向文件对象的指针,第二个参数是一个所有者标识符。 14. `int (*release) (struct inode *, struct file *)`:定义了文件的释放函数指针,用于释放文件对象和相关资源。这个函数的第一个参数是指向 inode 结构体的指针,第二个参数是指向文件对象的指针。 总之,`struct file_operations` 的各个成员定义了文件操作的各种函数指针,这些函数指针实现了文件的读取、写入、定位、异步 I/O、目录读取、poll、ioctl、内存映射、打开、刷新和释放等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值