C#学习(1)–基础语法与概念
C#概念以及.NET平台基本介绍
C#语言特色
- 简洁的语法
- 完全的面向对象程序设计
- 与Web紧密结合
- 充分的安全性与错误处理
- 灵活性
- 兼容性
C#编写应用程序
- 控制台应用程序
- Windows窗体应用程序
- ASP.NET Web窗体应用程序
- ……
.NET 平台概念
- 是微软推出的下一代软件开发和服务平台
- 是一种面向网络,支持各种用户终端的开发环境。
托管代码与非托管代码
- 托管代码(managed code)是指为.NET Framework编写的代码,在.NET Framework的公共语言运行库(CLR)控制之下运行,类似于JAVA的虚拟机机制。托管代码应用程序可以获得CLR服务,例如自动垃圾回收、类型检查和安全支持等。
- 非托管代码(unmanaged code)是指不在CLR控制之下运行的代码,如Win32 C/C++ DLL。非托管代码由操作系统直接运行,因此必须提供自己的垃圾回收、类型检查、安全支持等服务。
.NET Framework类库(FCL)
程序员可以十分方便地使用FCL中的类型及其成员,而不必编写大量代码来处理常见的低级编程操作。它是生成.NET Framework应用程序、组件和控件的基础。
FCL由命名空间组成。每个命名空间都包含可在程序中使用的类型,如类、结构、枚举、委托和接口等。
公共语言运行库(CLR)
CLR主要由CLS和CTS两部分组成。
CLR是.NET Framework的核心组件,它在操作系统的顶层,负责管理程序的执行。
(1)公共语言规范(Common Language Specification,简写为CLS)
各种编程语言之间不仅仅是数据类型的不同,语法也有非常大的区别。所以需要定义CLS,它定义了所有编程语言必须遵守的共同标准,包含函数调用方式、参数传递方式、数据类型和异常处理方式等。
(2)通用类型系统(Common Type System,简写为CTS)
CTS定义了一套可以在中间语言中使用的预定义数据类型,所有面向.NET Framework的语言都可以生成最终基于这些类型的编译代码。也就是说,通用类型系统用于解决不同编程语言的数据类型不同的问题,从而实现跨语言功能。
例如,无论VB中的integer类型(VB中的整型)还是C#中的int类型(C#中的整型),编译后都映射为System.Int32。所以CTS实现了不同语言数据类型的最终统一。
微软中间语言MSIL
- 使用.NET Framework语言编译器把源代码编译成与机器无关的中间语言MSIL
- 运行Microsoft中间语言(MSIL)之前,必须先根据CLR将其编译为适合目标计算机体系结构的本机代码
该机制使得.NET 平台可以实现跨平台
- .NET Framework 提供了使用JIT和NGen.exe两种方式来执行此类转换。
C#项目运行过程
C#语法
三种方式读入整数
a=int.Parse(Console.ReadLine());
b=int.TryParse(Console.ReadLine(),out a);
c=Convert.ToInt32(Console.ReadLine());
Console.WriteLine的格式化输出
object类
object是C#中所有类型(包括所有的值类型和引用类型)的基类,C#中的所有类型都直接或间接地从object类中继承而来。因此,对一个object的变量可以赋予任何类型的值。
在装箱拆箱是有用。
string类
- 注意!当使用@时后面的字符串不会转义
using System;
namespace _1._2
{
class Program
{
static void Main(string[] args)
{
string str1 = "123" + "abc"; //"+"运算符用于连接字符串
char c = "Hello World!"[2]; //"[]"运算符可以访问string中的单个字符,c='e'
string str2 = "\nChina";
string str3 = @"\nChina"; // 字符串的另一种表示形式,用@引起来。
Console.WriteLine(str2);
Console.WriteLine(str3);
}
}
}
值类型变量和引用类型变量的区别
值类型变量生活在栈空间中
值类型变量
C#中的值类型变量和C/C++语言中的普通变量(非指针变量)相似,这类变量直接包含它们的值。所有的值类型均隐式派生自 System.ValueType。
C#中在内存的栈空间中为值类型变量分配空间,而且没有单独的堆分配或垃圾回收开销。因此值类型变量会随着方法调用后栈空间的消亡而自动清除(C#中的值类型变量像C/C++语言中函数内的局部变量,函数执行完后由系统释放其存储空间)。
引用类型变量生存在堆空间中
引用类型变量
引用类型本身存在栈空间中,但是引用类型所指向的实例在堆空间中。
在C#中没有指针,而改为引用,引用表示某个对象的地址而不是变量或对象本身。
栈空间和堆空间
栈空间就是一个数据结构
- 栈空间是一种先进后出的数据结构。栈空间用于存储如下类型的数据
- 某些类型变量的值。
- 程序当前的执行环境。
- 传递给方法的参数。
堆空间是一块内存空间
- 在堆空间中可以分配大块的内存以存储某类型的数据对象。
- 与栈不同,堆里的空间能够以任意顺序存入和移除。
显式和隐式转换
显式类型转换
- 显式转换又叫强制类型转换,与隐式转换相反,显式转换需