一、数据类型
C# 语言中内置了一些基本的数据类型,数据类型用来指定程序中变量可以存储的数据的类型,C# 中的数据类型可以大致分为三类:
- 值类型(Value types);
- 引用类型(References types);
- 指针类型(Pointer types);
值类型
C# 中的值类型是从 System.ValueType 类中派生出来的,对于值类型的变量我们可以直接为其分配一个具体的值。当声明一个值类型的变量时,系统会自动分配一块儿内存区域用来存储这个变量的值,需要注意的是,变量所占内存的大小会根据系统的不同而有所变化。
引用类型
引用类型的变量中并不存储实际的数据值,而是存储的对数据(对象)的引用,换句话说就是,引用类型的变量中存储的是数据在内存中的位置。当多个变量都引用同一个内存地址时,如果其中一个变量改变了内存中数据的值,那么所有引用这个内存地址的变量的值都会改变。C# 中内置的引用类型包括 Object(对象)、Dynamic(动态)和 string(字符串)。
1) 对象类型(Object)
对象类型是 C# 通用类型系统(Common Type System:CTS)中所有数据类型的最终基类,Object 是 System.Object 类的别名。任何类型的值都可以分配给对象类型,但是在分配值之前,需要对类型进行转换。
将值类型转换为对象类型的过程被称为“装箱”,反之将对象类型转换为值类型的过程则被称为“拆箱”。注意,只有经过装箱的数据才能进行拆箱。
2) 动态类型(Dynamic)
您可以在动态类型的变量中存储任何类型的值,这些变量的类型检查是在程序运行时进行的。动态类型的声明语法如下所示:
dynamic <variable_name> = value;
例如:
dynamic d = 20;
动态类型与对象类型类似,但对象类型变量的类型检查是在编译时进行的,而动态类型变量的类型检查则是在程序运行时进行的。
3) 字符串类型(String)
字符串类型的变量允许您将一个字符串赋值给这个变量,字符串类型需要通过 String 类来创建,String 类是 System.String 类的别名,它是从对象(Object)类型中派生的。在 C# 中有两种定义字符串类型的方式,分别是使用" "
和@" "
。
指针类型
C# 语言中的指针是一个变量,也称为定位器或指示符,其中可以存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针具有相同的功能。
二、变量
变量可以理解为是我们程序可以操作的内存区域的名称,在 C# 中每个变量都有自己特定的类型,这个类型确定了变量所占内存的大小、布局、取值范围以及可以对该变量执行的操作。
可以将变量当作一种通过符号(变量名)表示某个内存区域的方法,变量的值可以更改,并且可以多次重复使用。C# 中的基本变量类型可以归纳为以下几种:
C# 中变量的名称并不是可以随意定义的,需要遵循如下所示的规则:
- 变量名中可以包含英文字母
a-z, A-Z
、数字0-9
和下划线_
; - 变量名只能以英文字母
a-z, A-Z
或下划线_
开头,不能以数字开头; - 变量名中不允许使用空格;
- 变量名不能是任何 C# 中的保留字或关键字,例如 char、float 等。
三、常量
常量需要使用 const 关键字定义,语法格式如下所示:
const data_type constant_name = value;
其中,data_type 为常量的数据类型;constant_name 为常量名(类似于变量名);value 为常量的值。
using System;
namespace c.biancheng.net
{
class Demo
{
static void Main(string[] args){
const double pi = 3.14; // 定义一个常量
double r;
Console.WriteLine("本程序可以计算圆的面积,请输入一个数字作为圆的半径: ");
r = Convert.ToDouble(Console.ReadLine());
double areaCircle = pi * r * r;
Console.WriteLine("半径为: {0}, 圆的面积为: {1}", r, areaCircle);
Console.ReadKey();
}
}
}
四、 foreach循环
使用 foreach 可以遍历数组或者集合对象中的每一个元素,其语法格式如下:
foreach(数据类型 变量名 in 数组或集合对象){
语句块;
}
foreach 会在每次循环的过程中,依次从数组或集合对象中取出一个新的元素放到foreach( )
里定义的变量中,直到所有元素都成功取出后退出循环。
【示例】使用 for 循环定义一个包含 1~100 以内所有数字的数组,然后使用 foreach 循环计算 1~100 以内所有数字的和:
using System;
namespace c.biancheng.net
{
class Demo
{
static void Main(string[] args){
int[] arr = new int[100];
for(int i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
int sum = 0;
foreach (int j in arr)
{
sum = sum + j;
}
Console.WriteLine("1~100 以内数字的和为:{0}", sum);
Console.ReadLine();
}
}
}
五、break、continue、goto:跳出循环
break 语句不仅可以用来终止 switch 语句,在循环语句中使用时还可以用来跳出循环,执行循环外的下一条语句。如果是在嵌套循环中使用,例如在内层的循环中使用 break 语句,那么程序只会跳出内层的循环,并不会影响到外层循环的执行。break 语句的执行原理如下图所示:
C# 中 continue 语句的工作原理与 break 语句类似,但是 continue 语句并不会跳出整个循环,而是跳过本次循环继续执行下一次的循环。continue 的执行原理如下图所示。
【示例】使用 for 循环输出 1~9 之间的数字,遇到 5 时跳过:
using System;
namespace c.biancheng.net
{
class Demo
{
static void Main(string[] args){
for(int i = 1; i <= 9; i++){
if(i == 5){
continue;
}
Console.Write("{0} ", i);
}
Console.ReadLine();
}
}
}
C# 中的 goto 语句也称为跳转语句,使用它可以控制程序跳转到指定的位置执行。不过并不建议在程序中多次使用 goto 语句,因为它会使程序变得更加复杂。goto 语句的语法格式如下所示:
goto Labels;
语句块1;
Labels:
语句块2;
想要使用 goto 语句来跳转程序,必须先在想要跳转的位置定义好一个标签(Labels),标签名称的定义和变量名类似,然后使用goto 标签名;
即可使程序跳转到指定位置执行。如上面语法中所示,程序会跳过“语句块1”直接执行“语句块2”。
提示:goto 语句并不限于在循环中使用,其它的情况也可以使用。但是,goto 语句不能从循环外跳转到循环语句中,而且不能跳出类的范围。