C#语言特点
- C#是微软发布发一种面向对象的、运行于.NET Framework和.NET Core(开源,跨平台)之上的高级语言。
- C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象语言,它在继承C和C++强大功能的同时去掉了一些它们复杂的特性。
C#与.NET的关系
.NET是一个开发平台,而C#是一种在.NET开发平台上使用最多的编程语言。
.NET Framework
.NET Framework 是一个可以快速开发、部署网站服务及应用程序的开发平台,是 Windows 中的一个组件,主要包括公共语言运行库 CLR(Common Language Runtime)和 .NET Framework 类库FCL(Framework Class Library)。
-
在 .NET Framework 框架中支持的编程语言包括 C#、VB、C++、J# 等, 但目前使用最多的是 C# 语言。
-
CLS(Common Language Specification, 公共语言运行规范)定义了一组规则,即可以通过不同的编程语言(C#、VB、J# 等)来创建 Windows 应用程序、ASP.NET 网站程序以及在 .NET Framework 中所有支持的程序。
-
CLR 是 .NET Framework 的基础。用户可以将 CLR 看作一个在执行时管理代码的代码,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格类型安全以及可提高安全性和可靠性的管理。
它与 JVM类似。以公共语言运行库为目标的代码称为托管代码,不以公共语言运行库为目标的代码称为非托管代码。
-
FCL 中包括 Windows Forms (Windows 窗体程序)、ASP.NET(网站程序)、WPF(Windows 的界面程序的框架)、 WCF(Windows 平台上的工作流程序)等程序所用到的类库文件。
-
C# 6.0 版本已经能在多个操作系统上使用,例如在 Mac、Linux 等。此外,还能将其应用到手机、PDA 等设备上。
.Net Core
.NET Core是一个开源的,跨平台的Framework,不管是开发web或移动设备都在同一个Framework(.NET Core)下运行,而且 .NET Core也可在不同的操作系统上运行,包括Windows、Linux、MacOS,实现了跨平台跨设备。
.NET Core 在发布程序时不用事先安装Framework而是通过Nuget下载,这样在初次部署时就不用安装一个复杂而庞大Framework,而是按需下载。这种基于Nuget的按需加载铸就了.NET Core 跨平台。
NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。
C#数据类型
C#数据类型分为:值类型、引用类型、指针类型。
值类型(Value types)
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True 或 False | False |
byte | 1字节 无符号整数 | 0 到 255 | 0 |
char | 2字节 Unicode 字符 | U +0000 到 U +ffff | '\0' |
short | 2字节 有符号整数类型 | -32,768 到 32,767 | 0 |
int | 4字节 有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
float | 4字节 单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
long | 8字节 有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0 |
double | 8字节 双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D |
decimal | 16字节 精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
引用类型(Reference types)
引用类型指的是一个内存位置,如果内存位置的数据是由一个变量改变的,则该引用类型变量会自动反应这种值的变化。内置的引用类型有:object
、dynamic
和 string
。
-
object 对象类型, 是 C# 所有数据类型的终极基类。object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
-
dynamic 动态数据类型, 用于存储任何类型的值,折现变量的类型检查发生在运行时。
动态类型与对象类型相似,但是对象类型的变量类型检查发生在编译时,而动态类型变量的类型检查发生在运行时。
-
string 字符串类型,是 System.String 类的别名。它是从对象(Object)类型派生的。String类型的值可以通过两种形式进行分配:引号和 @引号(加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待)。
指针类型(Pointer types)
指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。
C#类型转换
-
隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。小范围转大范围时使用。
-
显式类型转换 - 强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
大范围转小范围时使用。
// 数值类型转换
int intNum;
long longNum = 1;
intNum = (int) longNum;// 大范围转小范围 需要强制类型转换
longNum = intNum;// 小范围转大范围 自动类型转换
Console.WriteLine(intNum);// 1
Console.WriteLine(longNum);// 1
// 字符串转换数值
// 方式一 int.Parse()
int num1 = int.Parse("111");
Console.WriteLine(num1);// 111
// int num2 = int.Parse("a");// 抛System.FormatException
// 方式二 int.TryParse()
bool isSuccess = int.TryParse("a", out int num3);
Console.WriteLine(isSuccess);// False
Console.WriteLine(num3);// 0
// 方式三 Convert.ToInt32()
//int num4 = Convert.ToInt32("a"); // 抛System.FormatException
//Console.WriteLine(num4);
// 引用类型之间的转换
Student student = new Student();
object obj = student as object;
Console.WriteLine(obj);
object obj1 = new object();
Student student``````1 = obj1 as Student;
Console.WriteLine(student1==null);// True 转换失败返回null
object obj2 = null as object;
Console.WriteLine(obj2 == null);// True
C#常量
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制。
整数常量也可以有后缀,可以是 U 和 L 的组合,其中,U 和 L 分别表示 unsigned 和 long。后缀可以是大写或者小写,多个后缀以任意顺序进行组合。
定义常量:使用const
关键字
C#可空类型
? 单问号用于对 int、double、bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable 类型的。
int i; //默认值0
int? ii; //默认值null
Null合并运算符(??),如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。
int? num1 = null;
int? num2 = 666;
int num3;
num3 = num1 ?? num2; // num1为空,所以返回num2。即num3的值为666