C#基础 ----- readonly关键字

readonly关键字


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

此规则对于值类型和引用类型具有不同的含义:

  1. 由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。
using System;

namespace Study
{
     
    class Program
    {
     
        public int x;
        //在声明中初始化变量
        public readonly int y = 25;
        public readonly int z;
        public Program()
        {
     //使用构造函数初始化readonly变量
            z = 24;
        }
        public Program(int p1, int p2, int p3)
        {
     
            x = p1;
            y = p2;
            z = p3;
        }
        public static void Main()
        {
     
            Program p1 = new Program(11, 21, 32);//构造函数赋值
            Console.WriteLine($"p1: x={p1.x}, y={p1.y}, z={p1.z}");
            Program p2 = new Program();
            p2.x = 55;
            //p2.y = 23;//不可以直接对readonly值进行修改
            Console.WriteLine($"p2: x={p2.x}, y={p2.y}, z={p2.z}");

            Program p3 = new Program(11, 21, 32);
            //p3.Add(ref p3.x,out p3.y,ref p3.z);//无法将y,z只读作为ref,out参数传递
            p3.Add1(p3.x,p3.y,p3.z);
            Console.WriteLine($"p1: x={p3.x}, y={p3.y}, z={p3.z}");

            Console.Read();
        }

        public void Add(ref int x,out int y, ref int z)
        {
     
            y = x + z;
        }
        public void Add1(int x,int y, int z){
     }
        /*
         Output:
            p1: x=11, y=21, z=32
            p2: x=55, y=25, z=24
            p3: x=11, y=21, z=32
        */
    }
}
  1. 由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一对象。 该对象是可变的。 readonly修饰符可防止字段替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。
using System;

namespace Study
{
     
    class Program
    {
     

        public static void Main()
        {
     
            Student student = new Student();
            //student.name = "lisa";//不能直接修改值类型数据
            //student.books = new string[2];//只能初始化new或在构造方法中new
            student.books[0] = "语文书";//引用类型可以修改数据
            student.books[1] = "数学书";
            Console.WriteLine(student.books[0] + " "
                + student.books[1]);
            
            Console.Read();
        }
    }
    public class Student
    {
     
        public readonly string name = "lisa";
        public readonly string[] books;

        public Student() {
      books = new string[2]; }
        public Student(string name)
        {
     
            this.name = name;
        }
    }
         /*
         Output:
            lisa语文书 数学书
          */
}

你可能感兴趣的:(C#---基础,c#)