C#中的const和readonly关键字详解

const和readonly经常被用来修饰类的字段,两者有何异同呢?

const

1、声明const类型变量一定要赋初值吗?

一定要赋初值

public class Student
{
    public const int age;
}

生成的时候,会报如下错:

正确的应该这样写:

public class Student
{
    public const int age = 18;
}

2、声明const类型变量可以用static修饰吗?

不可以

public class Student
{
    public static const int age = 18;
}

生成的时候,会报如下错:

正确的应该这样写:

public class Student
{
    public const int age = 18;
}

因为const默认是static。

3、运行时变量可以赋值给const类型变量吗?

不可以

    public class Student
    {
        public const int age = 18;

        public Student(int a)
        {
            age = a + 1;
        }
    }

生成的时候,会报如下错:

const类型变量是编译期变量,无法把运行时变量赋值给编译期变量。

4、const可以修饰引用类型变量吗?

可以,但只能给引用类型变量赋null值。

    public class Student
    {
        public const Teacher teacher = new Teacher();
    }

    public class Teacher
    {
    }

生成的时候,会报如下错:

正确的应该这样写:

    public class Student
    {
        public const Teacher teacher = null;
    }

    public class Teacher
    {
    }

readonly

1、声明readonly类型变量一定要赋初值吗?

不一定,既可以赋初值,也可以不赋初值。

以下不赋初值的写法正确:

    public class Student
    {
        public readonly int age;
    }

以下赋初值的写法也对:

    public class Student
    {
        public readonly int age = 18;
    }

2、运行时变量可以赋值给readonly类型变量吗?

可以

以下在构造函数中给readonly类型变量赋值是可以的:

    public class Student
    {
        public readonly int age = 18;

        public Student(int a)
        {
            age = a;
        }
    }

3、声明readonly类型变量可以用static修饰吗?

可以的

以下写法正确:

    public class Student
    {
        public static readonly int age = 18;
    }

总结

const修饰符:

  • 用const修饰的变量是编译期变量
  • 不能把运行时变量赋值给const修饰的变量
  • const修饰的变量在声明时要赋初值
  • const修饰的变量不能在前面加static修饰
  • cosnt也可以修饰引用类型变量,但一定要给引用类型变量赋null初值

readonly修饰符:

  • 用readonly修饰的变量是运行时变量
  • 可以把运行时变量赋值给readonly修饰的变量
  • readonly修饰的变量在声明时,既可以赋初值,也可以不赋初值
  • readonly修饰的变量可以在前面加static修饰符

到此这篇关于C#关键字const和readonly的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#基础知识系列八const和readonly关键字详细介绍

    前言 不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下.在了解这两个关键字的时候我们先来了解一下静态常量和动态常量. 静态常量:是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值. 而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化.现在再来说明const与

  • 深入探讨C#中的const、readonly关键字

    首先不可否认,这些在面试上会经常被面试官问起,但是你回答的让面试官满意吗?当然如果你知道了这些原理,或许你就不 怕了.既然说到了原理,我们还是从MSDN说起. 一:值得推敲的几个地方 1.先来看看msdn上面对const是怎么说的,我们会看到.不能修改,编译时常量这些关键性信息. Q:  const为什么不能被修改. A:这个很简单,很多教科书上面都说,当编译器编译时,会将常量的值保存在该程序集的元数据中,下面我们做个实例 看一看. ①:新建一个projectA. 复制代码 代码如下: // P

  • C#中的const和readonly关键字详解

    const和readonly经常被用来修饰类的字段,两者有何异同呢? const 1.声明const类型变量一定要赋初值吗? 一定要赋初值 public class Student { public const int age; } 生成的时候,会报如下错: 正确的应该这样写: public class Student { public const int age = 18; } 2.声明const类型变量可以用static修饰吗? 不可以 public class Student { publ

  • c++中的volatile和variant关键字详解

    目录 一.两个长得有点像的变量 二.二者的功能 三.应用实例 四.总结 一.两个长得有点像的变量 对volatile关键字,其实很多人只是能用,知道用到啥处,但其实应用的原理并不知道.在一些多线程的通信中,往往是这个关键字应用到的场所,很多人也是如此想的.但其实这个想法是不准确的.volatile这个关键字的目的最初是针对硬件IO操作的,防止访问IO操作中的缓存影响到真实的数据.但这个关键字的溢出效应是,多线程也可以应用这个原理(注意在多核和多CPU编程中有危险,但是在其它语言如Java中,得按

  • C++中const修饰符的详解及其作用介绍

    目录 概述 常对象 常对象成员 常成员函数 常数据成员 数据成员访问限制 常对象修改的限制 常指针 指向常变量的指针 指向对象的指针 小结 对象的常引用 总结 概述 const 是 constant 的缩写, 是不变的意思. 在 C++ 中是用来修饰内置类型变量, 自定义对象, 成员函数, 返回值, 函数参数. const 可以帮我们避免无意之中的错误操作. 使用 const, 把有关的数据定义为常量 (常变量 / 常对象 / 常函数). const 既可以使数据在一定范围内共享, 又要保证它不

  • C++中的explicit关键字详解

    目录 前言 1. 抑制构造函数定义的隐式转换 2. 为转换显式地使用构造函数 3. 类型转换运算符可能产生意外结果 4. 显示的类型转换运算符 5. explicit练习 5.1 当不使用explict关键字时 5.2 使用explict关键字时 5.3 explicit 标识的构造函数中存在一个默认值 前言 最近在阅读android底层源码的时候,发现其中好多代码使用了explicit关键字,因此这里对explicit关键字进行了分析和介绍. 1. 抑制构造函数定义的隐式转换 在要求隐式转换的

  • Java中final关键字详解

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 主要介绍:一.final关键字的基本用法.二.深入理解final关键字 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能

  • C/C++ 中extern关键字详解

    C/C++ 中extern关键字详解 在C/C++编程过程中,经常会进行变量和函数的声明和定义,各个模块间共用同一个全局变量时,此时extern就派上用场了. 定义 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义,不需要分配内存,直接使用. 推荐:在.h中声明,因为在头文件定义的话,其他模块include此头文件,就会报重复定义错误 实验结论 1.在.h中声明 extern int g_a; 在.c中定义 int g_

  • Java中Volatile关键字详解及代码示例

    一.基本概念 先补充一下概念:Java内存模型中的可见性.原子性和有序性. 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.也就是一个线程修改的结果.另一个线程马上就能看到.比如:用volatile修饰的变量,就会具有可见性.volatile修饰的

  • Java中final关键字详解及实例

    final在Java中可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,如果你试图将变量再次初始化的话,编译器会报编译错误.  final的含义在不同的场景下有细微的差别,但总体来说,它指的是"不可变". 1. final变量 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量.final变量经常和static关键字一起使用,作为常量.用final关键字修饰的变量,只能进行一次赋值操作

  • JavaScript es6中var、let以及const三者区别案例详解

    首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?         ECMAScript是一个国际通过的标准化脚本语言.JavaScript由ECMAScript和DOM.BOM三者组成.可以简单理解为:ECMAScript是JavaScript的语言规范,JavaScript是ECMAScript的实现和扩展.         2011 年,ECMAScript 5.1 版发布.之前我们大部分人用的也就是ES5         2015 年 6 月,ECM

随机推荐