一、C# 数据类型结构
C# 数据类型分类:
值类型:简单类型:整数类型、浮点类型,布尔类型、字符类型; 符合类型:枚举类型、结构体类型
引用类型:数组、类、接口、委托,object,string
说明:值类型变量,存的是值;引用类型变量,存引用,指向对空间的对象。
数据结构堆栈:
托管堆不同于堆,它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了之后,会自动清理堆中的垃圾。所以,做为.net开发,我们不需要关心内存释放的问题。
①数据结构
堆栈:是一种后进先出的数据结构,它是一个概念,栈是一种后进先出的数据结构。
②内存堆栈:存在内存中的两个存储区(堆区,栈区)。
栈区:存放函数的参数、局部变量、返回数据等值,由编译器自动释放
堆区:存放着引用类型的对象,由CLR释放
简单数据类型:
1.整数类型
2.浮点类型
float数据类型用于较小的浮点数,因为它要求的精度较低。
double数据类型比float数据类型大,提供的精度也大一倍(15位)。
如果在代码中没有对某个非整数值(如12.3)硬编码,则编译器一般假定该变量是double。
如果想指定该值为float,可以在其后加上字符F(或f),如:
float f = 12.3F;
decimal类型专门用于进行财务计算,使用decimal类型提供的28位的方式取决于用户。
要把数字指定为decimal类型,可以在数字的后面加上字符M或(m),如:
decimal d=12.30M;
3.boo类型
4.char字符类型
二、C# 变量、常量
变量:是指在程序的运行过程中随时可以发生变化的量
常量:是指在程序在运行过程中不会发生变化的变量
常量的特点:
1、必须在声明是赋值
2、不能在在程序运行时,给常量赋值
3、常量是静态的。不必须(实际上,是不允许)在常量声明中包含修饰符static
常量是使用 const 关键字来定义的 。定义一个常量的语法如下:
const <data_type> <constant_name> = value;
C#中的变量的命名是是有规则的:
1)、由字母、数字或下划线"_"组成
2)、必须由字母或下划线"_"开头,不能以数字开头
3)、不能是c#中的关键字 如:int、string、bool、Main、class等
4)、区分大小写 如:小写的a 和 大写的A 是两个变量
三、C# 作用域
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域遵循以下规则:
只要类在某个作用域中,其字段也(也称成员变量)也在该作用域内。
- 局部变量存在于表示声明该变量的块语句或方法结束的右花括号({})之前的作用域内。(请认真解读读透这句话)
- 在for、while或类似语句中声明的局部变量存在于该循环体内。
- 局部变量的作用域冲突
大型程序在不同部分的变量使用相同的变量名很常见。只要变量的作用域是程序的不同部分,就不会有问题,就不会产生多义性。但请注意,同名的局部变量不能在统一作用域声明两次。例子如下:
public static int Main(){
int j=20;
for(int i=0;i<10;i++){
int j=30;
Console.WriteLine(j+i);
}
}
编译时提示的错误如下:
First.cs(24,10): error CS0136:
不能在此范围内声明名为“j”的局部变量,因为这样会使“j”具有不同的含义,而它已在“父级或当前”范围中表示其他内容了。
根据变量的作用域遵循的原则(局部变量存在于声明该变量的块语句或方法结束的右花括号({})之前的作用域内),第一个变量j是在for循环开始前定义的,它的作用域是Main()方法;第二个变量的作用域是在for循环;第一个变量j的作用域包含了第二个j的作用域。对编译器来说会存在歧义,因为编译器无法区分这两个变量,所以不允许声明第2个 变量。
2.字段和局部变量的作用域冲突
某些情况下,可以区分名称相同、作用域相同的两个标志符。此时编译器允许声明第2个变量。原因是C#在变量之间有一个基本的区分,他把类级别声明的变量看作字段(成员变量),而把方法中声明的变量看作局部变量。例子如下:
using System;
namespace Wrox
{
class ScopeTest{
public int j=20;
public static void Main(){
int j=30;
Console.WriteLine(j);
return;
}
}
}