持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
前言
之前一篇文章我们学习了const关键字,我们知道const关键字在C#中,仿佛是宏定义一样的,今天我们来学习readonly关键字,对于readonly关键字称为动态常量,也叫运行时常量,运行时常量的值是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化(当然也可以在声明的时候初使化),而可以延迟到构造函数中初始化。今天我们就来学习一下,创作不易,点赞关注评论收藏,你的点赞是我创作的动力,也是我学习的方向。
使用readonly关键字注意点
- 在字段声明中,
readonly
指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。 - 构造函数退出后,不能分配
readonly
字段。 此规则对于值类型和引用类型具有不同的含义:
1.由于值类型直接包含数据,因此属于readonly
值类型的字段不可变。
2.由于引用类型包含对其数据的引用,因此属于readonly
引用类型的字段必须始终引用同一对象。 该对象是可变的。readonly
修饰符可防止字段替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。 注意:
包含属于可变引用类型的外部可见只读字段的外部可见类型可能存在安全漏洞,可能会触发警告 CA2104:“不要声明只读可变引用类型。”- 在
readonly struct
类型定义中,readonly
指示结构类型是不可变的。 有关详细信息,请参阅结构类型一文中的readonly
结构一节。 - 在结构类型内的实例成员声明中,
readonly
指示实例成员不修改结构的状态。 有关详细信息,请参阅结构类型一文中的readonly
实例成员部分。 - 在
ref readonly
方法返回中,readonly
修饰符指示该方法返回一个引用,且不允许向该引用写入内容。
readonly关键字使用效果和const区别
const
常量必须有初始值,readonly
可以没有,readonly
可以在构造函数中进行赋值,而const
不可以,const
与 readonly
基本相似,但是在初始化方面,readonly
还可以通过静态构造函数进行赋值const
在程序编译期间获取字段的值,而 readonly
是在程序运行时获取字段的值。
总而言之就是: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#的技术就是先简单再难嘛,积少成多之后才会成长才会进步,我们要不断的学习不断的探索,才能有学习的动力,才会有学习的欲望,创作不易,点赞评论收藏关注,嘿嘿,不喜勿喷!!!!