constants and fields in c#
2010-10-12 23:22
309 查看
今天回顾了C#的常量和字段,又学习了不少,写点东西跟大家分享,也有利于自己记忆。
首先,我们说说C#的常量,顾名思义,常量存储的就是不可更改的值,那么常量在type中又是怎样被定义的呢?首先可以被定义为常量的类型只能是简单类
型:Boolean、
Char、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、
Decimal、
String,当然有一种特殊情况,可以对非简单类型的变量为声明为constant,只有在那个变量的值为null的时候。以下为代码示例:
常量是被当做类型变量的,就像static变量一样,常量会包含在元数据中,常量的值直接嵌入到元数据中。在编译的时候,complier根据常量
符号直接到元数据中找到那个值,然后直接嵌入到IL代码中,所以不需要动态分配内存。所以假如把上面那一段编译为dll文件的话(也即是一个
assembly),现在有这么一段代码:
编译这段代码,然后执行,毫无疑问结果就是32,如果现在把SomeNumber改为50,重新把它编译为dll文件,如果不重新编译上一段代码,执行结果不会改变,要想结果变为50,就必
须重新编译一遍,执行,结果就变为50,在这种情况下,dll文件甚至都不会被加载。
讲完常量,让我们接着说说字段是什么。
字段是一个类型的变量,它可以是一个值类型变量,也可以是一个引用类型变量,字段一般会有四种修饰符:static 、default、readonly、volatile。
在这里就简单讲述一下static 和readonly的用法:
static的意思就是说这个字段是属于类型的,表示类的状态,而default是表示类型实例的状态。
readonly表示这个字段是只读的,不能写,只能在构造函数中初始化。(反射能够用来修改readonly字段,反射是个啥玩意?只听说过,目前还没接触到)
字段是需要动态分配内存的,所以字段的值都是在运行时才能获得的。
采用常量那段类似的一个代码示例:
假如现在依旧有一个程序引用它编译之后的DLL,如下:
编译这段代码,结果依旧是32,如果把SomeNumber改为50,重新编译为dll,那么无需重新编译这段代码,直接执行结果变为50。
最后说一点,readonly声明的引用字段,引用变量是不可改变的,即不能指向别的对象,它指向的那个对象本身是可以改变的。
首先,我们说说C#的常量,顾名思义,常量存储的就是不可更改的值,那么常量在type中又是怎样被定义的呢?首先可以被定义为常量的类型只能是简单类
型:Boolean、
Char、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、
Decimal、
String,当然有一种特殊情况,可以对非简单类型的变量为声明为constant,只有在那个变量的值为null的时候。以下为代码示例:
using System; public sealed class SomeType { public const int SomeNumber = 32; public const SomeType = null ; }
常量是被当做类型变量的,就像static变量一样,常量会包含在元数据中,常量的值直接嵌入到元数据中。在编译的时候,complier根据常量
符号直接到元数据中找到那个值,然后直接嵌入到IL代码中,所以不需要动态分配内存。所以假如把上面那一段编译为dll文件的话(也即是一个
assembly),现在有这么一段代码:
using System; public class Program { Console.WriteLine("The const number is {0} ",SomeType.SomeNumber); }
编译这段代码,然后执行,毫无疑问结果就是32,如果现在把SomeNumber改为50,重新把它编译为dll文件,如果不重新编译上一段代码,执行结果不会改变,要想结果变为50,就必
须重新编译一遍,执行,结果就变为50,在这种情况下,dll文件甚至都不会被加载。
讲完常量,让我们接着说说字段是什么。
字段是一个类型的变量,它可以是一个值类型变量,也可以是一个引用类型变量,字段一般会有四种修饰符:static 、default、readonly、volatile。
在这里就简单讲述一下static 和readonly的用法:
static的意思就是说这个字段是属于类型的,表示类的状态,而default是表示类型实例的状态。
readonly表示这个字段是只读的,不能写,只能在构造函数中初始化。(反射能够用来修改readonly字段,反射是个啥玩意?只听说过,目前还没接触到)
字段是需要动态分配内存的,所以字段的值都是在运行时才能获得的。
采用常量那段类似的一个代码示例:
using System; public sealed class SomeType { public static readonly SomeNumber = 32; }
假如现在依旧有一个程序引用它编译之后的DLL,如下:
using System; public class Program { Console.WriteLine("The const number is {0} ",SomeType.SomeNumber); }
编译这段代码,结果依旧是32,如果把SomeNumber改为50,重新编译为dll,那么无需重新编译这段代码,直接执行结果变为50。
最后说一点,readonly声明的引用字段,引用变量是不可改变的,即不能指向别的对象,它指向的那个对象本身是可以改变的。
相关文章推荐
- Constants and Fields(Chapter 7 of CLR via C#)
- Converting Between Binary and Decimal in C#
- Delegates and Events in C# / .NET
- IList, ICollection ,IEnumerable AND IEnumerator in C#
- SQL Server Database Backup and Restore in C#
- Convert string to binary and binary to string in C#
- [Java学习] Iterator, foreach, generics and callback in Java, C# and Python
- Reading and Writing CSV Files in C#
- Exception handling in X++ and C#
- Gene Expression Programming (GEP) in C# and .NET
- An article about Equals and GetHashCode functions in C#
- Professional ASP.NET 3.5: In C# and VB
- C#: Writing a CookieContainer to Disk and Loading Back In For Use
- Intel-x86-System-Programming-Guide, Part 1,Chapter 2.3 SYSTEM FLAGS AND FIELDS IN THE EFLAGS REGISTER
- Create Native iOS, Android, Mac and Windows apps in C#
- New feature in C# 3.0 - aims to make data programmable in a general purpose and truly object oriented syntax
- Java Tip 27: Typesafe constants in C++ and Java
- Processing Global Mouse and Keyboard Hooks in C#
- LZW and Huffman Compression Algorithms Implemented in C#
- Agile Principles, Patterns, and Practices in C#