class="p0">常量是其值在使用过程中不会发生变化的变量。在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量:
const int a=100;//a的值将不可以改变
常量的特征:
在程序中使用常量至少有3个好处:
如以下程序:
namespace Test { class ScopeTest { static int j=20; const string time= DateTime.Now.ToString(); public static void Main() { int j=30; Console.WriteLine(j); return; } } }
编译后产生错误:
error CS0133:指派给“Test.ScopeTest.time”的表达式必须是常量。
对于以上代码中的time,如果需要的话,可以为其赋于readonly属性。
常量和只读其实都是只能访问不能修改的。但是他们的赋值时机不太一样,一般常量在编译的时候已经确定并赋予其常量值。而只读其实是一个变量他在运行时需要动态装载的时候才会给他赋予一个值,而这个值一旦赋予就不能再更改了。
类型推断使用var关键字。声明变量的语法有些变化。编译器可以根据变量的初始化值“推断”变量的类型,例如:
int someNumber=0;
就变成
var someNumber=0;
即使someNumber从来没有声明为int,编译器也可以确定,只要someNumber在其作用域内,就是一个int。编译后,上面两个语句是等价的。
下面是另外一个例子:
namespace Test { class Program { static void Main(string[] args) { var name ="Bugs Bunny"; var age=25; var isRabbit=true; Type nameType=name.GetType(); Type ageType=age.GetType(); Type isRabbitType=isRabbit.GetType(); Console.WriteLine("name is type "+nameType.ToString()); Console.WriteLine("age is type "+ageType.ToString()); Console.WriteLine("isRabbit is type"+isRabbitType.ToString()); Console.ReadKey(); } } }
编译运行程序:(如何编译程序请参照C#入门篇)
name is type System.String
age is type System.Int32
isRabbit is type System.Boolean
使用var定义变量是需要一些规则的。变量必须初始化。否则,编译器就没有推断变量类型的依据。初始化器不能为空,且必须放在表达始中。不能把初始化器设置为一个对象,除非在初始化器中创建一个新对象。
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域有一下规则:
大型程序的不同部分为不同的变量提供相同的变量名很常见。只要变量的作用域是程序的不同部分,就不会有问题。也不会产生模糊。但要注意,同名的局部变量不能在同一作用域内声明两次,所以如下代码是不能使用的:
int x=20;
int x=30;
再来看如下例子:
using System; namespace wpfworld.com { pulic static int main() { For(int i=0;i<10;i++) { Console.writeLie(i); } For(int i=0;i>=10;i— { Console.WriteLine(i); } } }
这段代码需要引起我们的注意。i出现了两次,但是他们都是相对于循环体的变量。
另一个例子:
public static int Main() { int j=20; for(int i=0;i<10;i++) { int j=30;//错误 Console.WriteLine(j+i); } return 0; }
这里会发生错误,因为变量j是在for循环开始前定义的,在执行for循环时应处于其作用域内,在Main方法执行后,变量j才超出作用域,第二个j(不合法)则在循环的作用域内,在作用域嵌套在Main方法的作用域内,编译器无法区别这两个变量。
字段或局部变量的作用域冲突:在某些情况下,可以区分名称相同(尽管其完全限定的名称不同)、作用域项目的两个标识。此时编译器允许声明第二个变量。原因是C#在变量之间有一个基本的区分,它把声明为类型级的变量字段看作字段,而把在方法中声明的变量看作局部变量。