值类型:(13种)
a.值类型变量可以直接分配给一个值。它们是从 类 System.ValueType 中派生的。
b.值类型直接存储其值
c. 值类型的实例通常是在线程栈上分配的(静态分配),但 是在某些情形下可以存储在堆中
d. 值类型总是分配在它声明的地方:作为字段时,跟随其所 属的变量(实例)存储;作为局部变量时,存储在栈上。栈 的内存是自动释放的。
e. 值类型在内存管理方面具有更好的效率,并且不支持多态, 适合用做存储数据的载体。
f. C#的值类型包括:结构体(数值类型、bool 型、用户定义 的结构体),枚举,可空类型。
引用类型(Reference types) :(2种)
a. 引用类型不包含存储在变量中的实际数据,但它们包含对 变量的引用。继承自 System.Object 类。
b. 引用类型存储对其值的引用。它们指的是一个内存位置。 使用多个变量时,引用类型可以指向一个内存位置。如果 内存位置的数据是由一个变量改变的,其他变量会自动反 映这种值的变化。
c. 引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。 当使用 new 创建一个类的实例时,分配堆上的空间,并把 堆上空间的地址保存到栈上分配的小片空间中。
d. 引用类型的对象总是在进程堆中分配(动态分配)。
e. 引用类型在栈中存储一个引用,其实际的存储位置位于托 管堆。简称引用类型部署在托管推上。 (堆内存是.NET 中会 由 GC 来自动释放)。
f. 引用类型可以派生出新的类型,而值类型不能,因为所有 的值类型都是密封(seal)的;
g. 引用类型可以包含 null 值,值类型不能(可空类型功能允 许将 null 赋给值类型,如 int? a = null; );
h. 引用类型变量的赋值只复制对对象的引用,而不复制对象 本身。而将一个值类型变量赋给另一个值类型变量时,将 复制包含的值。
i. C#的引用类型包括:
内置的 引用类型有:object、dynamic 和 string。
对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。 Object 是 System.Object 类的别名。所以对象 (Object)类型可以被分配任何其他类型(值类型、 引用类型、预定义类型或用户自定义类型)的值。 但是,在分配值之前,需要先进行类型转换。
动态(Dynamic)类型您可以存储任何类型的值在动 态数据类型变量中。这些变量的类型检查是在运行 时发生的。动态类型与对象类型相似,但是对象类 型变量的类型检查是在编译时发生的,而动态类型 变量的类型检查是在运行时发生的。
字符串(String)类型允许给变量分配任何字符串 值。字符串(String)类型是 System.String 类的 别名。它是从对象(Object)类型派生的。字符串 (String)类型的值可以通过两种形式进行分配: 引号和 @引号。
用户自定义引用类型有:class、数组、interface 或 delegate。
类型的转换
int.Parse():该方法只能将 string 类型数字字符串强制 转换为 int 类型
ToString 把类型转换为字符串类型。
变量
1C# 中提供的基本的值类型大致可以分为以下几类:
整数类型 sbyte、byte、short、ushort、int、uint、long、ulong 和 char
0是最小的正整数
-1是最大的负整数
有无符号:代表是否取得负数;
无符号:只有正整数
有符号:正负整数各取一半
Int:-2147483648~~~2147483647
浮点型 float 和 double
十进制类型 decimal
布尔类型 true 或 false 值,指定的值
空类型 可为空值的数据类型
2. 变量的声明
C#中变量定义的语法 <data_type> <variable_list>;
data_type:必须是一个有效的 C# 数据类型,可以是 char、 int、float、double 或其他用户自定义的数据类型。 variable_list:可以由一个或多个用逗号分隔的标识符名 称组成。
一些有效的变量定义如下所示
int i, j, k;
char c, ch;
float f, salary;
double d;
3. 变量的初始化
变量通过在等号后跟一个常量表达式进行初始化(赋值)。
a. 变量初始化是 C#强调安全性的另一种方式。简单的说,C# 编译器需要用某个初始值对变量进行初始化,之后才能在 操作中引用该变量。大多数现代编译器把未初始化标记为 警告,但 C#编译器把它当作错误来看待。这样可以防止我 们无意中从其他程序遗留下来的你内存中获取垃圾值。
b. C#确保变量在使用前初始化的两个方法 变量直接定义在类中或者结构中,如果没有显示初始 化,那么在创建变量的时候会有默认值 方法、事件内的变量必须在代码中显示初始化,之后 才能在语句中使用它们的值。此时初始化不是声明该 变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了他 的值,直接报错。
4. 变量的作用域 变量
的作用域是可以访问该变量的代码区域。一般情况下, 确定作用域遵循以下规则:
全局变量:只要类在某个作用域内,其成员变量也在该作 用域内
局部变量:存在于表示声明该变量的块级语句或方法结束 的大括号之前的作用域内
局部变量:在 for、while 或类似语句中声明的局部变量存 在于该循环语句内
计算机存储数据
整数在计算机中存储是以补码的方式存储的,想要知道补 码,必须先知道数字进制转换和原码和反码。
1.不同进制的组成和输出
二进制:以 0b 开头,由 0 和 1 组成
八进制:以 0 开头,由 0-7 组。(C#中没有现成的表示方式)
十进制:默认就是十进制,由 0-9 组成
十六进制:以 0x 开头,由 0-9+A-F 组成
2. 进制之间的转换算法 其他进制转十进制
口诀:将所有的位上面的值*进制数的次方连起来既可 以得到十进制
位值:每一个位数上面对应的值
进制数:本身是多少进制,进制数就是多少
次方:从右向左,从 0 开始编号,对应位上面的编号就 是改位的次方
反码
正数的反码和原码一致,负数的反码位数全部取反,除最 高位