C#基础知识之const与readonly(2)

1 public class MathHelper 2 { 3 public readonly float PI; 4 }

访问:

C#基础知识之const与readonly

 

2.readonly出了构造函数,对于这个实例而言就不可改变,因此下面的写法也是错误的

C#基础知识之const与readonly

     既然,我们强调"出了构造函数",那是不是意味着,我们在构建函数内部,可以一次或多次改变它的值?为了验证我们的猜想,我们对MathHelper改造如下:

1 public class MathHelper 2 { 3 public MathHelper() 4 { 5 this.PI = 3.15F; 6 this.PI = 3.14F; 7 } 8 public readonly float PI; 9 }

调用代码:

1 static void Main(string[] args) 2 { 3 MathHelper m = new MathHelper(); 4 Console.WriteLine(m.PI); 5 }

输出结果:

从以上的结果,我们可以看出,在构造函数中可以对readonly变量多次赋值,但一旦出了构建函数则是只读的.

 

3.有了第2点的支撑,下面我们可以验证readonly是实例的(不可变的第一种情况)这一结论,我们现在来验证这个结论.

   我们改造MathHelper如下:

   

1 public class MathHelper 2 { 3 public MathHelper(float pi) 4 { 5 this.PI = pi; 6 } 7 public readonly float PI; 8 }

调用如下:

1 static void Main(string[] args) 2 { 3 MathHelper m1 = new MathHelper(3.14F); 4 Console.WriteLine(m1.PI); 5 6 MathHelper m2 = new MathHelper(3.15F); 7 Console.WriteLine(m2.PI); 8 9 Console.Read(); 10 }

输出结果:

C#基础知识之const与readonly

我们实例化了两个不同的MathHelper,给PI赋予了不同的值,PI的值属于不同的实例,这也就验证了我们的结论.

 

4.readonly的内联写法

那有的童鞋说了,我还用过这样的写法,这说明了readonly可以在构建方法外赋值.如下所示:

1 public class MathHelper 2 { 3 public readonly float PI=3.15F; 4 }

     其实,这是一种内联写法,是C#的一种语法糖,只是一种语法上的简化,实际它们也是在构造方法中进行初始化的.C#允许使用这种简化的内联初始化语法来初始化类的常量、read/write字段和readonly字段。

 

5.readonly赋值的第二种情况:如果我用static修饰readonly会发生什么?

     前面讲const时,我们说过const是静态的,这种静态不可以显式指定,因此在const前加static会导致编译器编译失败.那我们把static修饰readonly会发生什么样的结果?

     首先,我们确定,静态的是属于类的,此时的readonly我们不能通过构造函数来指定.

1 public class MathHelper 2 { 3 public static readonly float PI=3.14F; 4 }

调用:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9a292c4872a06ad9416448f672d69081.html