C# 类型体系包含下列几种类别:
- 值类型:存储数据
- 引用类型:存储对实际数据的引用。引用类型也称为对象。
- 指针类型:仅可用于 unsafe 模式。
通过装箱和取消装箱,可以将值类型转换为引用类型,然后再转换回值类型。除了装箱值类型外,无法将引用类型转换为值类型。
值类型也可以为 null,这意味着它们能存储其他非值状态。
【值类型】
值类型主要由两类组成:
值类型主要由两类组成:
- 结构
- 枚举
- Numeric(数值)类型
- 整型
- 浮点型
- decimal
- bool
- 用户定义的结构。
【值类型的主要功能】
基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自 System.ValueType。
与引用类型不同,可以从值类型派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型无法包含 null 值。然而,可译为 null 的类型功能确实允许将 null 赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自 System.ValueType。
与引用类型不同,可以从值类型派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型无法包含 null 值。然而,可译为 null 的类型功能确实允许将 null 赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
【初始化值类型】
在使用 C# 中的局部变量之前,必须对其进行初始化。例如,可能声明未进行初始化的局部变量,如以下示例所示:
那么在将其初始化之前,无法使用此变量。可使用下列语句将其初始化:
此语句是下列语句的等效语句:
当然,可以用同一个语句进行声明和初始化,如下面示例所示:
使用 new 运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。
对于用户定义的类型,使用 new 来调用默认构造函数。
此调用后,该结构被认为已被明确赋值;也就是说该结构的所有成员均已初始化为各自的默认值。
在使用 C# 中的局部变量之前,必须对其进行初始化。例如,可能声明未进行初始化的局部变量,如以下示例所示:
int myInt;
myInt = new int(); // Invoke default constructor for int type.
此语句是下列语句的等效语句:
myInt = 0;
// Assign an initial value, 0 in this example.
当然,可以用同一个语句进行声明和初始化,如下面示例所示:
int myInt = new int();
- 或 -
int myInt = 0;
使用 new 运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。
对于用户定义的类型,使用 new 来调用默认构造函数。
Point p = new Point(); // Invoke default constructor for the struct.
此调用后,该结构被认为已被明确赋值;也就是说该结构的所有成员均已初始化为各自的默认值。
【引用类型】
引用类型的变量又称为对象,可存储对实际数据的引用。包括:
引用类型的变量又称为对象,可存储对实际数据的引用。包括:
- class
- interface
- delegate
【内置数据类型】
C# 是一种强类型语言。在变量中存储值之前,必须指定变量的类型。
C# 是一种强类型语言。在变量中存储值之前,必须指定变量的类型。
int a = 1;
string s = "Hello";
XmlDocument tempDocument = new XmlDocument();
注意,对于简单的内置类型(如 int)以及复杂的或自定义的类型(如 XmlDocument)都必须指定类型。
XmlDocument tempDocument = new XmlDocument();
【C# 包括对下面的内置数据类型的支持】
数据类型
|
范围
|
byte | 0 .. 255 |
sbyte | -128 .. 127 |
short | -32,768 .. 32,767 |
ushort | 0 .. 65,535 |
int | -2,147,483,648 .. 2,147,483,647 |
uint | 0 .. 4,294,967,295 |
long | -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807 |
ulong | 0 .. 18,446,744,073,709,551,615 |
float | -3.402823e38 .. 3.402823e38 |
double | -1.79769313486232e308 .. 1.79769313486232e308 |
decimal | -79228162514264337593543950335 .. 79228162514264337593543950335 |
char | 一个 Unicode 字符。 |
string | Unicode 字符的一个字符串。 |
bool | True 或 False。 |
object | 一个对象。 |
【内置数据类型在 C# 程序中有几种用法】
1. 作为变量:
2. 作为常数:
3. 作为返回值和参数:
1. 作为变量:
int answer = 42;
string greeting = "Hello, World!";
2. 作为常数:
const int speedLimit = 55;
const double pi = 3.14159265358979323846264338327950;
3. 作为返回值和参数:
long CalculateSum(int a, int b){
long result = a + b;
return result;
}
return result;
}
【默认值表】
由默认构造函数返回的值类型的默认值。默认构造函数是通过 new 运算符来调用的。
bool - false
byte - 0
char - '/0'
decimal - 0.0M
double - 0.0D
enum - 表达式 (E)0 产生的值,其中 E 为 enum 标识符。
float - 0.0F
int - 0
long - 0L
sbyte - 0
short - 0
struct - 将所有的值类型字段设置为默认值并将所有的引用类型字段设置为 null 时产生的值。
uint - 0
ulong - 0
ushort - 0
由默认构造函数返回的值类型的默认值。默认构造函数是通过 new 运算符来调用的。
bool - false
byte - 0
char - '/0'
decimal - 0.0M
double - 0.0D
enum - 表达式 (E)0 产生的值,其中 E 为 enum 标识符。
float - 0.0F
int - 0
long - 0L
sbyte - 0
short - 0
struct - 将所有的值类型字段设置为默认值并将所有的引用类型字段设置为 null 时产生的值。
uint - 0
ulong - 0
ushort - 0
【C# 中的数据类型分为两个基本类别】
- 值类型
- 表示实际数据
- 只是将值存放在内存中
- 值类型都存储在堆栈中
- int、char、结构
- 引用类型
- 表示指向数据的指针或引用
- 包含内存堆中对象的地址
- 为 null,则表示未引用任何对象
- 类、接口、数组、字符串
static void Main(string[] args){
int val = 100;
// 声明一个值类型的整型数据类型
Console.WriteLine("该变量的初始值为 {0}", val);
Test(val); // 由于该数据类型属于值类型,所以将恢复其初始值
Console.WriteLine("该变量的值此时为 {0}", val);
}
static void Test(int getVal){
int temp = 10;
getVal = temp * 20;
}
Console.WriteLine("该变量的初始值为 {0}", val);
Test(val); // 由于该数据类型属于值类型,所以将恢复其初始值
Console.WriteLine("该变量的值此时为 {0}", val);
}
static void Test(int getVal){
int temp = 10;
getVal = temp * 20;
}
class DataTypeTest{
public int Val;
}
static void Main(string[] args){
DataTypeTest objTest = new DataTypeTest();
objTest.Val = 100;
Test(objTest); // 传递属于引用类型的对象
// 由于该数据类型属于引用类型,所以会考虑新处理的值
Console.WriteLine("变量的值为 {0}", objTest.Val);
}
static void Test(DataTypeTest dataTest){
int temp = 10;
dataTest.Val = temp * 20;
}
}
static void Main(string[] args){
DataTypeTest objTest = new DataTypeTest();
objTest.Val = 100;
Test(objTest); // 传递属于引用类型的对象
// 由于该数据类型属于引用类型,所以会考虑新处理的值
Console.WriteLine("变量的值为 {0}", objTest.Val);
}
static void Test(DataTypeTest dataTest){
int temp = 10;
dataTest.Val = temp * 20;
}
【值类型和引用类型的区别】
- 值类型和引用类型的基本区别在于在内存中的存储方式。
- 值类型将值存放在内存中,存储在堆栈中;
- 引用类型的内存单元中只存放内存堆中对象的地址,而对象本身存放在内存堆中。
- 若引用类型的值是null,则表示未引用任何对象;
- 将一个值类型变量的内容赋值给另一个数值类型变量时,变量值被拷贝。
- 将一个引用类型的变量的内容赋值给另一个引用类型变量时,只是变量的内存地址被拷贝。
【装箱和取消装箱】
装箱是从值类型到引用类型的转换
取消装箱是从引用类型到值类型的转换
装箱是从值类型到引用类型的转换
取消装箱是从引用类型到值类型的转换
【C# 中的数据类型处理】
C# 提供了一种“统一类型系统”
C# 中所有数据类型都是从一个类即 object 类派生而来的
C# 提供了一种“统一类型系统”
C# 中所有数据类型都是从一个类即 object 类派生而来的
using System;
class ObjectProff{
public static void Main(){
string Objectval;
class ObjectProff{
public static void Main(){
string Objectval;
Objectval = 7.ToString();
}
}
}