社区
C#
帖子详情
static readonly与const有何区别?
kongming
2001-09-17 09:17:13
请问static readonly和const在用法上有什么区别吗?
...全文
1298
3
打赏
收藏
static readonly与const有何区别?
请问static readonly和const在用法上有什么区别吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wangjemmy
2001-09-18
打赏
举报
回复
发表时间:2001-9-16 18:22:29
有时你不想在在程序运行时改变域,如运行时程序依靠的数据文件,一个math类的pi值,或者任何在程序运行时你不想改变的值。为了处理这种情况,c#中定义了两个近似的、相关的成员类型:contants和read-only域。
Constants域
从字面可以看出,常数(用关键字const表示)在应用程序运行期间保持不变。当定义某个事物为const时记住两个规则:第一,定义成常数的成员的值是在编译时设置的——或者是由编程者指定,或者是由编译器设置缺省值;第二,一个常数成员的值必须被写为一个字面常数。
为了定义一个常数域,在要定义的成员前使用一个const关键字,如下所示:
using System;
class MagicNumbers
{
public const double pi = 3.1415;
public const int answerToAllLifesQuestions = 42;
}
class ConstApp
{
public static void Main()
{
Console.WriteLine("pi = {0}, everything else = {1}",
MagicNumbers.pi, MagicNumbers.answerToAllLifesQuestions);
}
}
请注意这个代码的一个关键点——不必在客户端实例化MagicNumbers类,因为const成员缺省是静态的。为了更清楚的展示它,我们列出这两个域在MSIL中生成时的情况:
answerToAllLifesQuestions : public static literal int32 = int32(0x0000002A)
pi : public static literal float64 = float64(3.1415000000000002)
Read-only 域
使用const域是非常有用的,因为他清楚的表明了编程者的意图。然而,这只能用于在编译时已经知道值的情况下。所以,当一个域只有在运行时才能知道值而且一旦初始化以后值便不能改变的情况下,编程者该怎么办呢?C#语言的设计者用Read-only域的办法解决了这个问题(在其他语言中一般不会处理)。
当你用readonly关键字定义了一个域时,你只能在一个地方设置这个域的值——构造函数。以后,域的值便不能被自身类或者使用这个类的客户改变。让我们看一个图形应用程序记录屏幕分辨率的例子。你不能用const处理这个问题,因为应用程序直到运行时才能确定终端用户的屏幕分辨率,所以你必须使用这样的代码:
using System;
class GraphicsPackage
{
public readonly int ScreenWidth;
public readonly int ScreenHeight;
public GraphicsPackage()
{
this.ScreenWidth = 1024;
this.ScreenHeight = 768;
}
}
class ReadOnlyApp
{
public static void Main()
{
GraphicsPackage graphics = new GraphicsPackage();
Console.WriteLine("Width = {0}, Height = {1}",
graphics.ScreenWidth,
graphics.ScreenHeight);
}
}
猛一看,这个代码正是我们需要的。然而,还有一点小问题:我们定义的readonly域是一个实例域,这意味着是用户在使用域之前必须先实例化类。这可能也不是什么问题,甚至这正是你想做的——在实例化类的时候正可以初始化readonly域的值。但如果你想要一个被定义成静态的、能在运行时被初始化的常数时该怎么办呢?这时,我们可以定义一个带static和readonly修饰符的域。然后,创建一个构造函数的特殊类型——static constructor。静态函数可以用来初始化static域、readonly域或其他的域。现在我们改变先前的例子,给屏幕分辨率域加上static和readonly,并且增加一个静态构造函数。
using System;
class GraphicsPackage
{
public static readonly int ScreenWidth;
public static readonly int ScreenHeight;
static GraphicsPackage()
{
// Code would be here to
// calculate resolution.
ScreenWidth = 1024;
ScreenHeight = 768;
}
}
class ReadOnlyApp
{
public static void Main()
{
Console.WriteLine("Width = {0}, Height = {1}",
GraphicsPackage.ScreenWidth,
GraphicsPackage.ScreenHeight);
}
}
sam1111
2001-09-18
打赏
举报
回复
用const 修饰符声明的变量的值在编译时给定,并且默认为static,调用时并不用实例化类。用 readonly 关键字声明的变量只能在构造函数中初始化,一旦初始化之后,无论是类本身还是类的客户都无法再修改它的值。相应地,必须对类实例化后才能调用用readonly声明的变量。
startsoft
2001-09-17
打赏
举报
回复
const型表达式的值在编译时形成,而static readonly表达式的值直到程序运行时才形成。
C#编程中
readonly
与
const
的
区别
C#编程中
readonly
与
const
的
区别
详解
C++ 中
const
和
static
readonly
区别
主要介绍了C++ 中
const
和
static
readonly
区别
的相关资料,需要的朋友可以参考下
C#程序设计-3期(KC008) KC008110100018-怎样
区别
const
,
static
和
readonly
?.docx
C#程序设计-3期(KC008) KC008110100018-怎样
区别
const
,
static
和
readonly
?.docx 学习资料 复习资料 教学资源
C#基础:基于
const
与
readonly
的深入研究
本篇文章是对c#中
const
与
readonly
进行了详细的分析介绍,需要的朋友参考下
c#.net中
const
和
readonly
的
区别
readonly
修饰符用来表示只读,
const
用来表示不变常量。顾名思义,只读表示不能进行写操作;不变常量不能被修改。这两者到底有什么
区别
呢
C#
111,125
社区成员
642,540
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章