一、数据类型
1、C#程序是一组类型声明
- C 程序是一组函数和数据类型
- C++ 程序是一组函数和类
- C# 程序是一组类型声明
2、类型是一种模板
类型由下面的元素定义:
- 名称
- 用于保存数据成员的数据结构
- 一些行为及约束条件
3、实例化类型
从某个类型模板创建实际的对象,称为实例化该类型
4、数据成员和函数成员
- 数据成员: 保存了与这个类的对象或整个类相关的数据
- 函数成员: 执行代码。函数成员定义类型的行为
5、预定义类型
简单类型包括以下3种:
- 11 种数值类型
- 1)不同长度的有符号和无符号整数类型。
- 2)浮点数类型 float 和 double。
- 3)一种称为 decimal 的高精度小数类型。与 float 和 double 不同,decimal 类型可以准确地表示分数。decimal 类型常用于货币的计算。
- 一种 Unicode 字符类型 char。
- 一种布尔类型 bool 。
3种非简单类型如下:
- string,它是一个 Unicode 字符数组。
- object,它是所有其他类型的基类。
- dynamic,使用动态语言编写的程序集时使用。
所有预定于类型都是直接映射到底层的 .NET 类型。
表-预定义简单类型
名称 | 含义 | 范围 | .NET 框架类型 | 默认值 |
---|---|---|---|---|
sbyte | 8位有符号整数 | -128~127 | System.SByte | 0 |
byte | 8位无符号整数 | 0~255 | System.Byte | 0 |
short | 16位有符号整数 | -32 768~32 767 | System.Int16 | 0 |
ushort | 16位无符号整数 | 0~65 535 | System.UInt16 | 0 |
int | 32位有符号整数 | -2 147 483 948~2 147 483 647 | System.Int32 | 0 |
uint | 32位无符号整数 | 0~4 294 967 295 | System.UInt32 | 0 |
long | 64位有符号整数 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 | System.Int64 | 0 |
ulong | 64位无符号整数 | 0~18 446 744 073 709 551 615 | System.UInt64 | 0 |
float | 单精度浮点数 | 5 × \times × 1 0 − 45 10^{-45} 10−45 ~ 3.4 × \times × 1 0 38 10^{38} 1038 | System.Single | 0.0f |
double | 双精度浮点数 | 5 × \times × 1 0 324 10^{324} 10324 ~ 1.7 × \times × 1 0 308 10^{308} 10308 | System.Double | 0.0d |
bool | 布尔型 | true false | System.Boolean | false |
char | Unicode 字符串 | U+0000~U+ffff | System.Char | \x0000 |
decimal | 小数类型的有效数字精度为28 位 | ± \pm ± 1.0 × \times × 1 0 24 10^{24} 1024 ~ ± \pm ± 7.9 × \times × 1 0 24 10^{24} 1024 | System.Decimal | 0m |
表-预定义非简单类型
名称 | 含义 | .NET 框架类型 |
---|---|---|
object | 所有其他类型的基类,包括简单类型 | System.Object |
string | 0个或多个 Unicode 字符所组成的序列 | System.String |
dynamic | 在使用动态语言编写的程序集时使用 | 无相应的 .NET 类型 |
6、用户定义类型
6种类型:
- 类类型(class)
- 结构类型(struct)
- 数组类型(array)
- 枚举类型(enum)
- 委托类型(delegate)
- 接口类型(interface)
7、C# 的五大数据类型
- 类(Classes):如Window,Form,Console,String
- 结构体(Structures):如Int32,Int64,Single,Double
- 枚举(Enumerations):如HorizontalAlignment,Visibility
- 接口(Interfaces)
- 委托(Delegates)
二、变量
1、什么是变量
- 表面上来看,变量的用途是存储数据
- 实际上,变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量
- 变量一共有7种
- 静态变量,实例变量(成员变量,字段),数组元素,值参数,引用参数,输出参数,局部参数
- 狭义的变量指局部变量,因为其他种类的变量都有自己的约定名称
- 简单地讲,局部变量就是方法体(函数体)里声明的变量
- 变量的声明
- 有效的修饰符组合 opt 类型 变量名 初始化器 opt
2、值类型的变量
- 以byte/sbtye/short/ushort 为例
- 值类型没有实例,所谓的“实例”与变量合而为一
引用类型的变量与实例 - 引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址
变量的默认值
常量(值不可改变的变量)
装箱与拆箱(Boxing & Unboxing)
3、 构造器
- 构造器(constructor)是类型的成员之一
- 狭义的构造器指的是“实例构造器”(instance constructor)
- 如何调用构造器
- 声明构造器
- 构造器的内存管理
ctor+按下两次Tab,自动生成构造器
new的时候在堆分配内存(成员变量,int ID和string Name),构造器中分配int占4字节,string占4字节(NULL),栈是对象本身占的内存块
三、值类型和引用类型
C#类型的派生谱系
1、值类型和引用类型
这两种类型的对象在内存种的存储方式不同。
- 值类型只需要一段单独的内存,用于存储实际的数据。(存放在堆还是栈取决于实际环境)
- 引用类型需要两端内存。
- 第一段存储实际的数据,它总是位于堆中。
- 第二段是一个引用,指向数据在堆中的存放位置。引用存放在栈里。
C# 中的值类型和引用类型
自动初始化
1、dynamic关键字
在编译时,编译器不会对 dynamic 类型的变量做类型检查。相反,它将与该变量及该变量的操作有关的所有信息打包。在运行时,会对这些信息进行检查,以确保它与变量所代表的实际类型一致。否则,将在运行时抛出异常。
2、值参数
参数以不同的方式从方法传入或传出数据,称为值参数。
使用值参数时,通过将实参的值复制到形参的方式把数据传递给方法。方法被调用时,系统执行如下操作。
- 在栈中为形参分配空间。
- 将实参的值复制给形参。
3、引用参数
引用参数
- 使用引用参数时,必须在方法的声明和调用中都使用 ref 修饰符。
- 实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或 null。
引用参数具有以下特征: - 不会在栈上为形参分配内存。
- 形参的参数名将作为实参变量的别名,指向相同的内存位置。
4、引用类型作为值参数和引用参数
在方法内设置引用类型形参时:
- 将引用类型对象作为值参数传递
如果在方法内创建一个新对象并赋值给形参,将切断形参与实参之间的关联,并且在方法调用结束后,新对象也将不复存在。
(注意:在方法内,对象所引用的数据成员会有改变) - 将引用类型对象作为引用参数传递
如果在方法内创建一个新对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值。
5、可选参数
为方法的形参赋默认值。