写点什么

C# readonly 关键字学习

作者:IC00
  • 2022-10-17
    湖南
  • 本文字数:1885 字

    阅读完需:约 1 分钟

C# readonly关键字学习

前言

之前一篇文章我们学习了 const 关键字,我们知道 const 关键字在 C#中,仿佛是宏定义一样的,今天我们来学习 readonly 关键字,对于 readonly 关键字称为动态常量,也叫运行时常量,运行时常量的值是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化(当然也可以在声明的时候初使化),而可以延迟到构造函数中初始化。今天我们就来学习一下,创作不易,点赞关注评论收藏,你的点赞是我创作的动力,也是我学习的方向。


使用 readonly 关键字注意点

  1. 在字段声明中,readonly 指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。

  2. 构造函数退出后,不能分配 readonly 字段。 此规则对于值类型和引用类型具有不同的含义:</br>1.由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。</br>2.由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一对象。 该对象是可变的。 readonly 修饰符可防止字段替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。

  3. 注意:包含属于可变引用类型的外部可见只读字段的外部可见类型可能存在安全漏洞,可能会触发警告 CA2104:“不要声明只读可变引用类型。”

  4. 在 readonly struct 类型定义中,readonly 指示结构类型是不可变的。 有关详细信息,请参阅结构类型一文中的 readonly 结构一节。

  5. 在结构类型内的实例成员声明中,readonly 指示实例成员不修改结构的状态。 有关详细信息,请参阅结构类型一文中的 readonly 实例成员部分。

  6. ref readonly 方法返回中,readonly 修饰符指示该方法返回一个引用,且不允许向该引用写入内容。


readonly 关键字使用效果和 const 区别

const常量必须有初始值,readonly可以没有,readonly可以在构造函数中进行赋值,而const不可以,const 与 readonly 基本相似,但是在初始化方面,readonly 还可以通过静态构造函数进行赋值const 在程序编译期间获取字段的值,而 readonly 是在程序运行时获取字段的值。</br>总而言之就是:const是相当于宏定义,编译时运行,而readonly在运行时获得值,另外就是const要初始化要赋常量值,而readonly不用。readonly相当于const的扩展,初始化全局变量赋值之后在程序不能改变,如果是在实体类中初始化,能在构造函数中改变值,有一丝丝动态宏定义的感觉。



使用 const 情况,是会报错的,但是定义全局变量概念是一样的

代码逻辑

简单的代码逻辑,可以参考使用,有什么问题,评论留言,我们一起探讨一下


using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;
namespace Test10113{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } public readonly int m = 25; public readonly int n; class IC00 { public int a; // public const int a1 = 1; // public const int b1; public readonly int b = 25; public readonly int c; public IC00()//构造无参函数 { // a1 = 5; c = 24; }
public IC00(int x, int y, int z)//构造有参函数 { // b1 = x; a = x; b = y; c = z; } } private void Form1_Load(object sender, EventArgs e) {

Console.WriteLine(m); Console.WriteLine(n); IC00 iC00 = new IC00(); Console.WriteLine(iC00.c); IC00 iC = new IC00(10,20,30); Console.WriteLine(iC.b);

} }}
复制代码

总结

这篇文章比较简单,只是简单的学习一下,对它有更多的认识,在有需求的时候最起码有路子,虽然很简单,但是也是可以学到东西的,我们学习了新的知识,对我们的知识储备及技术又有新的一点点的进步,C#的技术就是先简单再难嘛,积少成多之后才会成长才会进步,我们要不断的学习不断的探索,才能有学习的动力,才会有学习的欲望,创作不易,点赞评论收藏关注,嘿嘿,不喜勿喷!!!!



发布于: 刚刚阅读数: 3
用户头像

IC00

关注

一个热爱生活,喜欢拍照的热血青年 2022-07-14 加入

一个想学习技术的小盆友,想努力更文,争取今年发100篇

评论

发布
暂无评论
C# readonly关键字学习_C#_IC00_InfoQ写作社区