一个变量只不过是一个供程序操作的存储区的名字
C#中的变量分为:
Console.WriteLine(typeof(int)); // 使用typeof(x)得到类型 Console.WriteLine(sizeof(int)); // 使用sizeof(x)得到大小
值类型直接存储数据,值类型也属于类,是从System.ValueType派生来的(这是判断依据),但是值类型的继承机制是不允许用户自己改变的。常用的一些值类型如下,有些默认的数据长度和C不一样。
类型 | 描述 |
---|---|
bool | 布尔值(True或False) |
byte | 8位无符号整数 |
sbyte | 8位有符号整数 |
short | 16位有符号整数 |
ushort | 16位无符号整数 |
int | 32位有符号整数 |
uint | 32位无符号整数 |
long | 64位有符号整数 |
ulong | 64位无符号整数 |
float | 32位浮点数 |
double | 64位浮点数 |
decimal | 128位浮点数 |
char | 16位Unicode字符 |
引用类型存储的是对数据的引用,主要有以下3类:
这是一个通用类型,可以被分配任何类型的值,但是在分配值之前需要进行类型转换(装箱/拆箱),转换是在编译过程中完成的。object是C#的一个保留关键字,是一个数据类型;而Object是一个类,一般是系统提供的System.Object类。
问题:type不是类型,System.Type是类型,对吗?
和object类似,这也是一个通用类型,但是dynamic的类型检查是在运行时发生的。
字符串类型。string是C#的一个保留关键字,是一个数据类型;而String是一个类,一般是系统提供的System.String类。
string Path1 = "C:\\Windows"; // 普通字符串 string Path2 = @"C:\Windows"; // 逐字字符串,将反斜杠当作普通字符对待 Console.WriteLine(Path1); Console.WriteLine(Path2);
// 关于引用类型的一些问题 static void Main(string[] args) { string Str1 = "Hello!"; // 真正的数据是这个字符串常量 string Str2 = Str1; // 这里应该不会复制数据吧,复制也太蠢了 string Str3 = Str1; Console.WriteLine(Str1 + Str2 + Str3); Str1 = "Again!"; // 这不是修改数据,而是引用新的内存 Console.WriteLine(Str1 + Str2 + Str3); // 只有Str1变化了 // 现在Str2和Str3是引用同一个位置的 // 如果通过Str2修改其引用的数据呢? // 答案是禁止修改,无法通过安全的方式修改其引用的数据 }
注意:数组也是引用类型。
一般都需要显式打开allow unsafe code才能使用指针
指针类型和C中的指针类似。
结构体是值类型(类是引用类型),不能继承,可以有成员函数。
关于结构体:
// 结构体是按值传递的 using System; public class MainApp { struct Data { public int m_Number; public void Log() { Console.WriteLine ($"Number = {m_Number}"); } } static void ProcessRef(ref Data data) { data.m_Number = 20; } static void Process(Data data) { data.m_Number = 10; } public static void Main(string[] args) { Data data = new Data(); data.Log(); // Number = 0 Process(data); data.Log(); // Number = 0 ProcessRef(ref data); data.Log(); // Number = 20 } }
double D = 3.14; int I = (int)D; // 使用括号 Console.WriteLine(I); // 可能会丢失数据
int Small = 1; long Big = Small; // 安全的转换会自动进行
var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而不是在运行时确定的。和C++的auto一样,变量类型确定之后就不能再更改。var让写法更简短,并且var变量是一个强类型。
default是C#的一个关键字,用于返回对应数据类型的默认值,使用方法:
int x = default(int);
其中: