C#中的变量和常量

时间:2022-08-31 08:10:50

数据类型、类型转换、变量、常量

在编写C#程序时,无论是声明变量还是常量,都必须用到数据类型,C#中的数据类型根据其定义可以分为两种,这两种类型的差异在于数据的存储方式,值类型的变量本身直接存储其值,而引用类型则存储实际数据的引用,程序通过此引用找到其值

值类型:值类型变量直接存储其值,主要包括整数类型、浮点类型、以及布尔类型等。值类型变量在堆栈中进行分配,因此效率很高,使用值类型主要是为了提高性能。值类型变量具有以下特性:

值类型变量都存储在堆栈中
访问值类型变量时,一般都是直接访问其实例
每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响其他变量
复制值类型变量时,复制的是变量的值,而不是值的地址
值类型不能为null,必须有一个确定的值
值类型是从System.ValueType继承而来的类型

整数类型
整数类型代表一种没有小数点的整数数值,在C#中内置的整数类型有:

类型 说明 范围
sbyte 8位有符号整数 -128~127
short 16位有符号整数 -32768~32767
int 32位有符号整数 -2147 483 648~2147 483 647
long 64位有符号整数 -9223372036854775808~9223372036854775807
byte 8位无符号整数 0~255
ushort 16位无符号整数 0~65535
uint 32位无符号整数 0~4294967295
ulong 64位无符号整数 0~18446744073709551615

浮点类型
浮点类型变量主要用于处理含有小数的数值数据,C#中内置类型是:

类型 说明 精度 范围
float 4字节IEEE单精度浮点数 精确到7位数 -3.4×1038 到 +3.4×1038
double 8字节IEEE双精度浮点数 精确到15~16位数 ±5.0 × 10−324到±1.7 × 10308
decimal 16字节浮点数 精确到28~29位数 (-7.9x1028-7.9x1028)/(100-28)

如果不做任何设置,包含小数点的值都被认为是double类型,如果要将值以float类型来处理,就应该通过强制使用f或F将其指定为float类型

 float value=9.21f;
 float value=3.15F;
 float values=(float)value;

布尔类型
布尔类型主要用来表示true/false值,一个布尔值的变量,其值只可能是true或者false,布尔类型的变量不能与其他类型之间进行转换


引用类型
引用类型是构建C#应用程序的主要对象类型数据,引用类型的变量又称为对象,存储对实际的引用,C#支持两种预定义的引用类型,即object和string

类型 描述
object object类型在.NETFramework中是Object的别名,在C#的统一类型系统中,所有类型(预定义类型,用户定义类型,引用类型和值类型)都是直接或间接从Object继承的。
string string类型表示零或更多Unicode字符组成的序列
引用类型具有如下特征:

必须在托管堆中为引用类型变量分配内存
必须使用new关键字来创建引用类型变量
在托管堆中分配的每个对象都有与之相关联的附加成员,这些成员必须被初始化
引用类型变量是由垃圾回收机制来管理的(GC)
多个引用类型变量可以引用同一对象,这种情形下,对一个变量的操作会影响另一个变量所引用的同一对象
引用类型被赋值前值都是null


值类型和引用类型的区别

类型 存储方式 存储位置
值类型 直接存储其值 值类型在栈中操作,栈在编译就分配好内存空间(创建在线程栈上)
引用类型 存储对值的引用 引用类型在堆中分配存储单元,堆是程序运行中根据程序的运行状况动态分配内存大小(创建在托管堆上)

枚举类型
枚举类型是一种独特的值类型,用于声明一组具有相同性质的常量,使用枚举可以增加程序的可读性和可维护性。

'''定义枚举'''
public enum TimeOfDay
{
    Moning = 0,
    Afternoon = 1,
    Evening = 2,
};
'''调用'''
static void Main(string[] args)
 {
   Console.WriteLine(TimeOfDay.Afternoon);
 }

在定义枚举类型时,如果不对其进行赋值,默认情况,第一个枚举值为0,后面每个枚举值递增1


类型转换
类型转换是将一种类型转换成另一种类型,转换可以是隐式转换或者显示转换

隐式转换:不需要声明就能进行的转换,进行隐式转换时,编译器不需要进行检查就能安全的进行转换,一般用于从低精度、小范围的数据类型转换为高精度、大范围的数据类型时使用。
显式转换:显式转换又被称为强制转换,需要在代码中明确声明要转换的类型。
装箱:将值类型转换为引用类型的过程叫装箱。
拆箱:将引用类型转换为值类型的过程叫拆箱。
在装箱拆箱操作时,要注意类型的兼容性


变量
变量本身是用来存储特定类型的数据,可以根据需要随时改变变量中所存储的数据值,变量名由名称、类型、值组成。使用变量之前必须先声明变量,指定变量的类型和名称,未经声明的变量无法在程序中使用。

int i=0;
string name="akon";

变量作用域

变量按照作用域被划分为3种:全局变量、局部变量、循环内部变量
全局变量在程序加载时就分配了内存,整个程序运行完时才回收;局部变量在程序运行到时分配内存,方法执行完就回收;循环内部变量也一样。

常量
常量就是值固定不变的量,C#提供了两种类型的常量,一种是用const关键字声明;另一种用readonly关键字声明。

const double pi=3.1415926;'''常量在定义时必须初始化'''

C#中使用readonly关键字声明只读字段,只读字段与常量用法类似,区别在于readonly无需在编译时初始化值,可以在类型构造函数中初始化readonly的值

class Person
{
    public Person(int age)
    {
        this.Age = age;'''在构造函数中初始化其值'''
    }
    readonly int Age;'''定义只读字段'''
}