注意:const编译期常量是编译的时候就确定的,可以查看IL代码,是写死的.如果另一个程序集引用后,该程序集没有进行编译,则值不会改变. 看效果: 项目中有2个程序集: 其中:常量在这个程序集中定义并初始化. namespace ConstReadOnlyTest { public class Class1 { public const string a= "我是const常量."; public static string b = "我是static变量."; p…
readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly 字段可能具有不同的值. 另外, const 字段是编译时常量,readonly 字段为运行时常量. 你应该尽量使用运行时常量.原因是变异性常量虽然性能稍微快一些.但是却没有 运行时常量那么灵活.就像第一段中所说,使用readonly时,根据使用的构造函数, readonly字段可能具有不同的值.…
原文链接:http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念. 1.全局字符串池(string pool也有叫做string literal pool) 全局字符串池里的内容是在类加载完成,经过验证…
转载. https://blog.csdn.net/zm13007310400/article/details/77534349 简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN.博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨: 在Java的内存分配中,总共3种常量池: 1.字符串常量池(String Constant Pool): 1.1:字符串常量池在Java内存区域的哪个位置…
Java编译时常量和运行时常量 编译期常量指的就是程序在编译时就能确定这个常量的具体值. 非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量. 在Java中,编译期常量指的是用final关键字修饰的基本类型或String类型并直接赋值(非复杂运算)的变量(无论是否用static修饰),是编译器的一种优化,体现在字节码文件中:运行是常量是由运行时解释器解释完成的. 运行时常量很容易理解,接下来会简单的结合字节码文件来介绍编译时常量及使用风险. public class Consta…
java编译: java编译就是.java文件变成.class文件的过程,这个过程一般在我们常用的编译器中进行,例如Ecliplse和IDEA等:下面以IDEA举例: 执行上述编译使用的JDK版本就是我们不同编译器所设置的java版本: java运行: java运行就是我们编译得到的字节码文件(就是.class文件)在安装了Java运行环境(JVM)的计算机上运行,此时使用的的JDK版本就是我们配置的JAVA_HOME对应的java版本.我们可以通过在命令行执行:java -version来查看…
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量. const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值. 下面声明两个常量: ; //A为运行时常量 ; //B为编译时常量 下面的表达式: int C = A + B; 经过编译后与下面的形式等价: ; 可以看到,其…
运行时常量池是方法区的一部分,方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等. String.intern()是一个native方法,它的作用是:如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池中这个字符串的String对象:否则,将此String对象包含的字符串添加到常量池中,并返回此String对象的引用.在JDK1.6及之前版本中,由于常量池分配在永久代中(即方法区),我们可以通过-XX:PermSize和-XX:MaxPe…
运行时常量池是方法区的一部分,方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等. String.intern()是一个native方法,它的作用是:如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池中这个字符串的String对象:否则,将此String对象包含的字符串添加到常量池中,并返回此String对象的引用. 在JDK1.6及之前版本中,由于常量池分配在永久代中(即方法区),我们可以通过-XX:PermSize和-XX:MaxP…
//const修饰的数据叫做 常量 //常量一旦声明常量的值就不能改变. //常量在声明的时候 必须要赋初始值 //C#编译器在编译的时候 声明常量的那句话不见了. //在使用常量的地方就用常量的值代替了. //某些数据在整个程序的运行过程中其值不会发生改变 我们就把这个值定义常量 以提高程序的运行效率 内容: 我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的…
1 package p1.exception; 2 /* 3 * 对于角标是整数不存在,可以用角标越界表示, 4 * 对于负数为角标的情况,准备用负数角标异常来表示. 5 * 6 * 负数角标这种异常在java中并没有定义过. 7 * 那就按照java异常的创建思想,面向对象,将负数角标进行自定义描述.并封装成对象 8 * 9 * 这种自定义的问题描述成为自定义异常. 10 * 11 * 注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具有可抛性. 12 *…
C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序则要好过一个快速但不能正常工作的程序. 考虑到这些,你应该尽量使用运行时常量,而不是编译期常量. 虽然编译期常量略微快一些,但是却没有运行时常量那么灵活.应紧紧在那些性能异常敏感,且常量的值在各个版本之间绝对不会变化时,再使用编译期常量. 运行时常量使用readonly关键字声明,编译期常量则使用c…
常量是程序运行期间恒定不变的量,许多程序设计语言都有某种方式,向编译器告知一块数据是恒定不变的,例如C++中的const和Java中的final. 根据编译器的不同行为,常量又分为编译时常量和运行时常量,其实编译时常量肯定就是运行时常量,只是编译时常量在编译的时候就被执行计算,并带入到程序中一切可能用到它的计算式中. 以Java为例,static final int a = 1将是一个编译时常量,编译后的符号表中将找不到a,所有对a的引用都被替换成了1. 而static final int b…
C#有两种类型的常量:编译期常量和运行时常量.两者有截然不同的行为,使用不当的话,会造成性能问题,如果没法确定,则使用慢点,但能保证正确的运行时常量. 运行时常量使用readonly关键字声明,编译期常量则使用const关键字声明: //声明编译期常量 public const int Millennium = 2000; //声明运行时常量 public static readonly int ThisYear = 2017; 二者最重要的区别在于,readonly值是运行时解析的,而cons…
今天在看书的时候遇到了一个不是很懂的名词,是在think in java 这本书的第七章讲final关键字时讲到的.然后自己在网上查了一下知道了一些. 编译器常量就是:它的值在编译期就可以确定的常量.也就是说在编译的时候就已经为用到这些常量的地方赋好值了.下边这段程序可以很好地帮助我们找出哪些是编译期常量哪些不是. package com.wenge.compileTest; public class CompileTest{ public static void main(String arg…
公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里 的 public 可选的.实际上这些变量在编译时会被替换掉,因为编译器知道这些 变量的值,并且知道这些变量在运行时不能改变.这种方式存在的一个问题是你 使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改 变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的 jar.为了 避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序.…
const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变. NSString * const pt1; II 指向常量的指针 // 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改 const NSString * pt2; III 指向常量的常量指针 const NSString *  const pt3; extern 等同于c,全局变量的定义, //…
const 后的常量,程序对其中只能读不能修改. #include <iostream> using namespace std; int main() { const double pi=3.141592; //圆周率的值用pi表示 cout<<"圆周率的近似值是"<<pi<<endl; ; } 宏定义 #define 和常量 const 的区别 类型和安全检查不同 宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可…
在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰 你能区分下面的吗?知道什么时候用吗? #define HSCoder @"汉斯哈哈哈" NSString *HSCoder = @"汉斯哈哈哈"; extern NSString *HSCoder; extern const NSString *HSCoder; static const NSString *HSCoder = @"…
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具体的类型,在编译阶段会执行类型检查. (3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存. const常量会在内存中分配(可以是堆中也可以是栈中). (4)const  可以节省空间,避免不必要的内存分配. 例如:          #define PI 3…
1.0:常量 常量被关键字const 所修饰 我们来看看常量的demo class Program { static void Main(string[] args) { const string name = "soaeon"; Console.WriteLine(name); Console.ReadKey(); } } 下面我们看看该demo的反编译结果 哈哈  关于反编译的结果  我们可以看到 定义的  const string  name="soaeon"…
1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时候进行替换 具体来说,有如下区别: 1.const定义的常量有数据类型,而define没有 2.const定义的常量分配了内存空间,而define定义的常量却不分配空间. 但是define不仅只是在定义常量时发挥作用,还可以定义带参数的宏,做到一定程度上的泛型.…
原文网址:http://www.jianshu.com/p/f83335e036b5 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰 你能区分下面的吗?知道什么时候用吗? #define HSCoder @"汉斯哈哈哈" NSString *HSCoder = @"汉斯哈哈哈"; extern NSString *HSCoder; extern const NSString *HSCod…
1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是objdump –d xx底层编译器实现其实还是指针. (1)引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用. ; ; //错误.非常量引用的初始值必须为左值 int &re = ival; //ok int &re2 = &ival; //错误.不可用对象…
常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量).常量默认大小写敏感.通常常量标识符总是大写的. 可以用define()函数来定义常量.在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用.一个常量一旦被定义,就不能再改变或取消定义. 常量只能包含标量数据(boolean.integer.float和string).可以定义resource常量,但应尽量避免,因为会造成不可预料的结果…
所谓常量是一个简单的标识符.在脚本执行期间该值不能改变.常量默认大小写敏感.通常常量标识符总是大写的.常量只能包含标量数据(boolean.integer.float和string).可以定义resource常量,但应尽量避免,因为会造成不可预料的结果. define部分宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.)宏的语法为: #define 宏名称 宏值 作为一种建议和一种广大程序员共同的习惯,宏名称经常使用全部大写的…
http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=402470669&idx=1&sn=e34db91190d8d46f0668537b664dd168&scene=24&srcid=0326hW2JAxwwKSpEoguz1V9M#wechat_redirect 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰 你能区分下面的吗?知…
const是伪常量,无法用于数组的初始化和全局变量的初始化,本质就是限定一个变量不能直接赋值. 如以下代码: #define A 10 int arr[A]; //const本质,伪常量 ,无法用于数组初始化和全局变量初始化 /* const int B = 10; int arr[B]; */ 但是如果局部变量是能够初始化编译并运行的 void main() { ; int arr[B]; } const是伪常量,都知道常量是不能改变值的.例如这样是根本无法编译的. void main() {…
1.常量是一个简单的标识符,在脚本运行期间,值不可改变,默认大小写敏感. 答:使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很多. 1.const用于类成员变量的定义,一经定义,不可修改.Define不可以用于类成员变量的定义,可用于全局常量. 2.Const可在类中使用,define不能 3.Const不能再条件语句中定义常量 <?php if (...){ const FOO = 'BAR'; // 无效的i…
概述 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰.你能区分下面的吗?知道什么时候用吗? #define HSCoder @"汉斯哈哈哈" NSString *HSCoder = @"汉斯哈哈哈"; extern NSString *HSCoder; extern const NSString *HSCoder; static const NSString *HSCoder = @&q…