带你了解C#中的只读结构体

发布时间:2020-11-03 15:41:22 作者:Leah
来源:亿速云 阅读:173

今天就跟大家聊聊有关带你了解C#中的只读结构体,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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 关键字出现的原因。如果(仅)在结构体的定义中添加它,如下所示:

public readonly 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;
 }
}

编译器会显示如下面截图中的错误提示:

带你了解C#中的只读结构体

为什么会这样?这是因为当我们向结构体定义添加 readonly 关键字,其实是把每个属性都设置为只读的了,包括 this 的值。

要让代码通过编译的唯一方法是把所有内容都设置为只读的,也就是说我们的结构体应该像这样:

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

 public string Surname { get; }

 public int Age { get; }

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

因此,添加 readonly 可以消除结构体实例内部或外部发生意外赋值或修改值的可能性。不过,需要注意的一件事是,如果您经常使用无参构造函数并给属性赋值,像这样:

Person s = new Person();
//错误
s.Age = 15;
s.Name = "asd";
s.Surname = "qwe";

或者像这样:

//错误
Person s = new Person
{
 Age = 15,
 Name = "asd",
 Surname = "qwe"
};

虽然此结构体的默认无参构造函数仍然可以调用,但给任何属性赋值都将引发编译错误,因为属性是只读的。
实际上,对此结构体的无参构造函数的调用会将其所有属性设置为它们的默认值,而且在结构体实例的整个生命周期中,永远不会被修改。

正确的初始化方法是调用参数化构造函数:

Person s = new Person("asd", "qwe", 15);

总之,这将有助于更容易地表明您的意图,因为您可以从一开始就定义这个结构体是不可变和不可修改的。

译者总结

使用 readonly 修饰符声明 struct 的目的就是为了明确地声明一个不可变的值类型。

readonly 结构体的所有数据成员都必须是只读的:

这就保证了 readonly 结构体的成员不会修改该结构体的状态。在 C# 8.0 及更高版本中,除构造函数外的其他实例成员都是隐式 readonly 的。

看完上述内容,你们对带你了解C#中的只读结构体有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. 浅谈C#结构体
  2. C# 结构体的介绍

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

只读结构体

上一篇:idea实现添加数据库的方法

下一篇:鸿蒙 JavaScript GUI 技术栈解析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》