Unity相关知识体系梳理(一)c#语言_2
昨天我们进行了C#的第一部分的梳理,即C#的起源部分。而我们接下来要讲的是C#中,也是所有语言中最底层也是最根源的东西,变量,常量,数据类型。
C# 数据类型
值类型
变量是一个程序操作的存储区的名字,在 C# 中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局。范围内的值可以存储在内存中,可以对变量进行一系列操作。C#变量分为以下几种类型:值类型,引用类型和指针类型。下面表中是C#中的值类型
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True 或 False | False |
byte | 8 位无符号整数 | 0 到 255 | 0 |
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | ‘\0’ |
decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
double | 64 位双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D |
float | 32 位单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
sbyte | 8 位有符号整数类型 | -128 到 127 | 0 |
short | 16 位有符号整数类型 | -32,768 到 32,767 | 0 |
uint | 32 位无符号整数类型 | 0 到 4,294,967,295 | 0 |
ulong | 64 位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 |
ushort | 16 位无符号整数类型 | 0 到 0 到 65,535 | 0 |
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。
值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。
如需得到一个类型或一个变量在特定平台上的准确尺寸(即该变量在内存空间中的大小),可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。
让我们尝试一下在控制台程序中试验一下各个类型的存储尺寸(以int型变量为例)
打开VS2017,建立新的控制台程序,命名为"MemorySpaceTest"依照下面范例写入代码并启动
namespace DataTypeApplication
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Size of int: {0}", sizeof(int));
Console.ReadLine();
}
}
}
从得出的结果可以看出,int类型的数据在内存中占用4字节大小。
我们所使用的变量类型决定了该数据在内存中的位置和大小,相同值的数据使用用不同的类型在内存中所占的大小和计算它的方法并不相同。所以我们要合理的使用相应类型的变量,这样既可以有效的加快运算的计算速度和效率。
引用类型
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的引用类型有:object、dynamic 和 string。而用户自定义的引用类型有Class,interface 和delegate等。
Object类型是C# 中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以Object类型可以被分配任何其他类型。但是,在分配值之前,需要先进行类型转换。这一步骤被称为"装箱",与之对应的,将Obejct类型转换成为其他类型时进行的操作称之为"拆箱 "
object obj;
obj = 100; // 这是装箱
int TmpA=(int)obj; //这是拆箱
Dynamic类型可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
Dynamic TmpA=20;//此处dynamic类型在编译后会转换成为Int类型
string类型允许给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从Object类型派生的。String类型的值可以通过两种形式进行赋值
String str = "runoob.com";
String str = @"runoob.com";
这两种赋值方法在一般的时候并没有什么区别,但是在赋值路径的时候
String str="C:\\Windows";
String str=@"C:\Windows";
用户自定义的类型,我们会在后面的课程中仔细的学习他们。
指针类型
指针类型是一种不安全的类型,我们在此并不会学习它,在以后的学习过程中,也并不会使用它。有兴趣的同学自己参考 C#不安全代码。
C#变量
我们已经讨论了各种数据类型。C# 中提供的基本的类型大致可以分为以下几类:
类型 | 举例 |
---|---|
整数类型 | sbyte、byte、short、ushort、int、uint、long、ulong 和 char |
浮点型 | float 和 double |
布尔类型 | true 或 false 值,指定的值 |
空类型 | 可为空值的数据类型 |
引用类型 | string、Class、interface、delegate |
自定义值类型 | enum等 |
其中,引用类型中Class、interface、delegate和自定义值类型enum,我们将在后面着重讨论。
变量的定义和赋值
C#中有效定义变量的例子如下
int tmpIntA,tmpIntB,tmpIntC,tmpIntD;
string tmpStringA;
float tmpFloatA;
即,数据类型+名称的方式对变量进行定义。并且在定义后,我们会对变量进行赋值。第一次赋值称之为初始化,例子如下
int tmpIntA=2;//正确 且tmpIntA的初始化赋值为2;
string tmpStringA;//声明变量tmpStringA,且并未初始化,如果不初始化tmpStringA 的初始值为null;
tmpStringA = "Hello World";// 为tmpStringA初始化赋值,值为Hello world;
int tmpIntB=0.5;//错误,int为整数类型,0.5不为整数,初始化失败;
当变量值并未进行初始化时,值类型会采用默认值,引用类型String的默认值为null。当变量赋值时,所赋值必须符合变量自身的类型,否则会发生错误。正确地初始化变量是一个良好的编程习惯,否则有时程序会产生意想不到的结果。
常量
常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。
我们平时使用的常量主要靠两个修饰符定义,const和readonly。const可在类和方法中定义,必须在声明时就进行初始化且之后不能进行更改。而readonly只能在声明时或构造函数中初始化,只能在类中定义。
class Program
{
const int tmpIntA=1;//在类中定义并初始化
readonly int a=1; // 声明时初始化
readonly int b;
Program()
{
b=2;//构造函数中初始化
}
static void Main()
{
const int tmpIntB=2;//在方法中定义并初始化
}
}
在C#中也有一些系统定义好的常量,如Pi=3.1415…,E=2.7182…等。