您的位置:首页 > 科技 > 能源 > 个人网页制作成品免费开源代码_宿迁网页设计培训_谷歌关键词排名优化_百度推广app

个人网页制作成品免费开源代码_宿迁网页设计培训_谷歌关键词排名优化_百度推广app

2025/1/8 12:56:17 来源:https://blog.csdn.net/qq_39847278/article/details/144826303  浏览:    关键词:个人网页制作成品免费开源代码_宿迁网页设计培训_谷歌关键词排名优化_百度推广app
个人网页制作成品免费开源代码_宿迁网页设计培训_谷歌关键词排名优化_百度推广app

总目录


前言


一、C#9.0 以前不可变数据的实现方式

1. 声明readonly变量

在这里插入图片描述

    internal class Program{static void Main(string[] args){Class1 class1 = new Class1();//取值,输出结果:JackConsole.WriteLine(class1.Name);Console.ReadKey();}}public class Class1{public readonly string Name = "Tom";public Class1(){Name = "Jack";}public void Test(){// Name = "Tom";}}

通过代码发现,readonly的变量,我们可以在声明变量和构造函数中赋初始值,其余的地方均会报错。

2. 仅包含 get 访问器的属性

在这里插入图片描述

    internal class Program{static void Main(string[] args){Class1 class1 = new Class1();//取值,输出结果:JackConsole.WriteLine(class1.Name);Console.ReadKey();}}public class Class2{public string Name { get; } = "Tom";public Class2(){Name = "Jack";}public void Test(){//Name = "Tom";}}

只读属性的简化过程

    public class Class2{//不同只读的编写方式//只读属性方式1public string Name { get; } = "Tom";//只读属性方式2public string NickName { get { return "测试昵称"; } }//只读属性方式3public string NickName2 { get => "测试昵称2"; }//只读属性方式4public string Phone => "151********";public Class2(){Name = "Jack";}}

3. 参数化构造函数

以上在构造函数中赋初始值的方式,可以通过参数化构造函数优化一下,使实例化更为灵活。

    internal class Program{static void Main(string[] args){Class1 class1 = new Class1("Hack","151********");//赋值,由于是只读的,因此会报错//class1.Name = "jack";//取值,输出结果:Hack - 151********Console.WriteLine($"{class1.Name} - {class1.Phone}");Console.ReadKey();}}public class Class1{public string Name { get; }public string Phone { get; } public Class1(){}public Class1(string name, string phone){Name = name;Phone = phone;}}

这种方式是可行的,也达到只读的目的,但是代码量多,需要增加额外的构造方法来实现初始化赋值,并且如果字段越多,带参构造函数也会越大,开发工作量也越大,更不好维护。

为了改变这种状态,C#9.0提供了一种解决方案:在对象初始换的时候就配置为只读的方式。

2. C# 9.0 init 实现不可变数据

1. init 的使用

  • init是扩大readonly实例字段的赋值方式,C#9之前readonly实例字段只能在字段初始值设定项和实例构造函数中赋值(静态只读字段还是只有两种赋值方式)。
  • C#9 推出init 以后,readonly实例字段可以多一种赋值方式,可以在对象初始值设定项中赋值。
    • 如下面案例中的Name属性 Class1 class1 = new Class1() { Name="名称3"};
    internal class Program{static void Main(string[] args){Class1 class1 = new Class1() { Name="名称3"};//此处赋值会报错//class1.Name = "";    Console.WriteLine($"Class1.Name的值为:{class1.Name}"); //Class1.Name的值为:名称3}}class Class1{public string Name { get; init; } = "名称1";public Class1(){Name = "名称2";}}

2. private set、read only 和 init 属性之间的区别

通过一个案例说明

class PersonPrivateSet
{public string FirstName { get; private set; }public string LastName { get; private set; }public PersonPrivateSet(string first, string last) => (FirstName, LastName) = (first, last);public void ChangeName(string first, string last) => (FirstName, LastName) = (first, last);
}class PersonReadOnly
{public string FirstName { get; }public string LastName { get; }public PersonReadOnly(string first, string last) => (FirstName, LastName) = (first, last);
}class PersonInit
{public string FirstName { get; init; }public string LastName { get; init; }
}
PersonPrivateSet personPrivateSet = new("Bill", "Gates");
PersonReadOnly personReadOnly = new("Bill", "Gates");
PersonInit personInit = new() { FirstName = "Bill", LastName = "Gates" };
  • private set 版本和 read only 版本都需要调用方使用添加的构造函数来设置 name 属性。
  • 通过 private set 版本,人员可在构造实例后更改其名称。
  • init 版本不需要构造函数。 调用方可使用对象初始值设定项初始化属性:

结语

回到目录页:C# 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
C# init用法
C#9.0:Init
init(C# 参考)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com