在C#中声明变量使用语法:
datatype identifine;
例如:
int i;
该语句声明int变量i。编译器不允许在表达式中使用这个变量,除非用一个值初始化了该变量。
i= 10;
或者是:
int i=10;
在一个语句中声明多个变量
int x=1,y=2;
声明不同类型的变量,需要使用单独的语句
int x=20;
bool y=true;
变量的初始化
C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量。
C#中有两个方法可以确保变量在使用前进行了初始化:
- 变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其默认值就是0
- 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。
例如,在C#中不能使用下面的语句:
public static int main()
{
int d;
Console.WriteLine(d);//Can't do this ! Need to initialize d before use
return 0;
}
这段代码中,定义了Main(),返回一个int类型的数据,而不是void。
编译会报错。
考虑该语句:
Something objSomnthing;
在C#中,会为Something对象创建一个引用,但这个引用还没有指向任何对象。对该变量调用会报错。
在C#中实例化一个引用对象需要使用new关键字。创建一个引用,使用new关键之把该引用指向存储在堆上的一个对象:
objSomething = new Something();
类型推断使用var关键字。编译器可以根据变量的初始值“推断”变量的类型。
int someNumber = 0;
就变成:
var someNumber = 0;
编译后上述两个句子是等价的。
例子:
using System;
namespace Wrox
{
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();
}
}
}
输出结果如下: name is type System.String age is type System.Int32 isRabbit is type System.Bool
需要遵循的规则:
- 变量必须初始化
- 初始化器不能为空
- 初始化器必须放在表达式中
- 不能把初始化器设置为一个对象,除非在初始化器中创建了一个新对象
变量的作用于遵循的规则:
- 只要类在某个作用域内,其字段也在该作用域内
- 局部变量存在于表示声明该变量的块语句或方法结束的右花括号之前的作用域内
- 在for、while或类似语句中声明的局部变量存在于该循环体内
同名的局部变量不能在同一作用域内声明两次,所以不能使用下面的代码:
int x=20; int x=30;
考虑下面的代码
using System;
namespace Wrox
{
class Program
{
public static int Main ( )
{
for (int i=0;i<10;i++)
{
Console.WriteLine(i);
}
for (int i=9 ;i>=0;i--)
{
Console.WriteLine(i);
}
return 0;
}
}
}
代码中的i声明了两个,是因为i在两个不同的循环内部声明。
2.字段和局部变量的作用域冲突
某些情况下,可以区分名称相同、作用域相同的两个标识符。此时编译器允许声明第2个变量。它把类型级别声明的变量看做字段,而把方法中声明的变量看做局部变量
using System;
namespace Wrox
{
class ScopeTest2
{
static int j=20;
public static void Main ( )
{
int j=30;
Console.WriteLine(j);
return;
}
}
}
虽然在Main()方法的作用域内声明了两个变量j,类级别定义的j,在该类删除前是不会超出作用域的(在本例中,当Main()方法终止时,参会删除该类);以及在Main()中定义的j。此时,在main()方法中声明的新变量j隐藏了的同名的类级别变量,所以在运行时,会显示30。
引用类级别变量
Console.WriteLine(ScopeTest2.j);
const int a = 10;
特点
- 常量必须在声明时初始化。指定了其值后,不能在改写
- 常量的值必须能在编译时用于计算。因此,不能从一个变量中提取的值来初始化常量
- 常量时静态的。注意,在常量声明中包含修饰符ststic。
常量的好处:
- 使用易于读取的名称
- 常量使程序易于修改
- 常量更容易避免程序出现错误
总结
以上就是今天要讲的内容!



