C#基础
Hello World!程序
using System;
namespace Hello_World
{
class Program
{
static void Main()
{
Console.WriteLine("Hello World!");
}
}
}
在此程序使用using System,是因为要使用System.Console命名空间中的类Console,using System声明允许语句忽略命名空间来引用这个类,从而调用Console.WriteLine方法。如果不使用using System的话,那么调用Console.WriteLine方法则要添加命名空间:
System.Console.WriteLine("Hello World");
其中使用using static声明除了打开命名空间,还能打开类的静态成员。
本例中还声明了一个类Program。类的声明包括class关键字,其后是类名和花括号。
类Program包含了一个方法Main(),每一个C#可执行文件都必须有一个入口点:Main()方法(M大写)。Main方法要么是void类型,要么就是int类型,方法的定义格式如下:
[modifiers] return_type MethodName ([parameters])
{
//method body
}
Main()方法包含了一条语句Console.WriteLine("Hello World!"),WriteLine()是一个静态方法,调用时不需要实例化Console对象。这条语句的作用使控制台窗口显示Hello World!
变量
变量声明格式:
datatype identifier;
例如:int i;
int a, b;
声明后可以赋值,例如:i = 10;
a = 1; b = 2;
也可以声明并初始化,例如:
int i = 10;
int a = 1, b = 2;
初始化变量
和其他编译器不同,C#编译器需要对变量赋初值,才能引用变量,没有初始化变量时引用变量,编译器会报错。
当变量是类或结构体的字段时,如果没有显式初始化,创建变量时其值为0;
方法中的局部变量必须在代码显式初始化后才能使用其值。
对于语句:
Something objsomething;
代码为Something对象创建了一个引用,但引用未指向任何对象,因此我们需要使用new关键字,实例化一个引用对象:
objsomething = new Something();
类型推断
类型推断使用var关键字, 编译器可以通过变量初值推断出变量类型,例如:
var a = 0;
等价于
int a = 0;
使用var时需要注意的规则:
变量必须初始化,否则编译器推断不出变量类型
初始化器不能为空
初始化器必须放在表达式中
不能把初始化器设置为一个对象,除非在初始化器中创建了一个新对象
变量作用域
作用域规则
只要类的局部变量在某个作用域内,其字段也在该作用域中
局部变量存在于声明该变量的块语句或方法结束的右括号之前的作用域内
在for,while等类似语句声明的局部变量存在于该循环体内
1.局部变量的作用域冲突
同名的局部变量不能在同一作用域声明两次
上面value的作用域都在Main方法内,出现冲突从而出现错误。
再看一个例子
上面两个变量i的作用域在for循环内,没有发生冲突能够正常运行。
最后一个例子
第一个i作用域在Main方法中,第二个i作用域在for循环中,发生冲突从而出现错误。
字段和局部变量的作用域冲突
某些情况下,可以 区分名称相同,作用域相同的两个标识符,原因在于C#可以把类型级别声明的变量看成字段,把方法中声明的变量看成局部变量。看一个例子:
在这段代码中,位于Main()方法的value和another_value分别隐藏了位于Program的value和another_value,从而编译成功。
要访问静态字段时,我们可以使用语法object.fieldname来引用字段value,如上面的Program.value。
要访问实例字段时,我们可以实例化一个类Program的对象program,然后使用this.another_value或者program.another_value访问字段another_value。
常量
常量是在使用过程中其值不会发生变化的量,在声明和初始化变量时,使用const修饰的变量就会被指定成一个常量。例如:
const int i = 0;
常量的特点:
常量必须要在声明时初始化,初始化后值不能发生改变。
常量必须能在编译时用于计算,因此不能用变量的值来初始化常量。
常量是隐式静态的,但不能在常量声明前包含修饰符static
使用常量的3个好处:
使用了便于读取的变量名代替不易阅读的数值或者字符串,使程序易于阅读。例如:
const double pi = 3.1415926;
使程序更易于修改。当程序中常量的值发生变化时,只需要修改常量就行,如果没有使用常量,一个一个修改常量的值非常麻烦。例如:
如果记错了3.1415926的值,修改pi的值就能直接修改所有使用pi的地方,如果没有定义常量pi而是使用3.1415916的话,程序中每一个3.1415926都需要修改,非常麻烦。
常量更容易避免程序出现错误。如果在声明常量的其他位置对常量赋值,编译器将会标记错误