C#基础

思考并回答以下问题:

  • .Net的本质是个软件怎么理解?
  • 电脑上的.Net Framework是怎么来的?安装在什么位置?
  • Mono是什么?
  • Unity是基于.Net什么版本的?
  • .sln和.csproj分别是什么意思?
  • C#的数组存在什么问题?是如何解决的?

C#是为Unity服务的,C#学的再好Unity学不好没多大意义。

C#基础

.Net的本质其实是一个运行在操作系统上的软件。一般所说的.Net指的是.Net Framework框架。

安装路径:C:\Windows\Microsoft.NET

mono是一个开源跨平台的.net运行环境。Mono也是一个软件。
https://download.mono-project.com/archive/5.20.1/windows-installer/mono-5.20.1.19-x64-0.msi

C#通过.Net平台开发的应用程序,能不能运行在某个计算机上面,取决于该计算机是否安装了对应版本的.Net Framework框架。

基于.Net Framework3.0开发的程序如果只使用了.Net Framework2.0的功能,也可以运行在.Net Framework2.0环境下。

Unity是基于.Net Framework3.5的。

VS

解决方案和项目

一个解决方案可以有多个项目

启动项目是粗体,可以右键“设为启动项目”,运行的时候就执行此项目。

解决方案(.sln)文件其实是一个文本文件,这个文件记录着解决方案管理的项目(项目名称与路径)。

项目文件(.csproj),也是一个文本文件,这个记录了项目里面的资源。

注意:在VS里面,项目移除可以重新加载,项目里的资源被移除则是永久删除。

快捷注释

注释:先CTRL+K,然后CTRL+C。

取消注释: 先CTRL+K,然后CTRL+U。

.Net编译原理

Main函数是程序的入口,也是程序的出口。

Net平台的重要组成部分

一、 重要组成部分:

1、FCL: 框架类库

我们在编程的时候,经常会用到一些功能,微软事先把这些功能写好(比如像控制台输出信息(例如Console.WriteLine()),产生一个随机数),封装在一个一个的类里面,然后把这些类放在.Net平台中,这些类的集合,我们就叫做框架类库(可以看做是功能的集合)。我们可以用各自的语法来调用

2、CLR:公共语言运行时

它是.Net程序运行的必备环境
如果.Net程序要在系统上运行,那么系统上面必须安装CLR
注意:CLR是无法单独安装的,它集成在.Net框架里面,将.Net框架安装在系统上,系统里面就有了CLR和FCL

二、如何获取.Net程序的可运行文件

这个文件能不能在电脑上运行,取决于电脑是否安装了对应的.Net框架

Net程序的编译原理

1、C#源代码通过C#编译器,编译成程序集,程序集里面包含微软中间语言(MSIL)

2、运行程序集的时候,CLR中的即时编译器(JIT,Just In Time)会将微软中间语言转换为本地平台对应的二进制指令,然后交给CPU去运行

C#编译器也是由.Net框架提供的。

CLR在运行时管理程序的执行,包括以下内容:

  • 内存管理和垃圾收集(C和C++是自己操作内存,内存泄漏时,需要自己检查内存泄漏,但C#通过CLR完成)
  • 代码安全验证
  • 代码执行、线程管理及异常处理

托管代码和非托管代码

从 .NET Framework 4 开始,所有 .NET Framework 版本都是就地更新的,因此,在系统中只能存在一个 4.x 版本。 此外,某些版本的 Windows 操作系统上预装了特定版本的 .NET Framework。 这表示:
如果在计算机上已安装了更高的 4.x 版本,则无法安装以前的 4.x 版本。
如果操作系统预安装了特定的 .NET Framework 版本,则无法在同一计算机上安装以前的 4.x 版本。
如果你安装更高版本,则无需先卸载以前的版本。

.NET Framework 是软件开发平台(框架),C#是.NET框架中支持的其中一种语言。
C#语言的运行载体是.NET框架。

C#源文件要经过C#编译器编译成托管程序集元数据,就是exe程序或者dll库。

然后由.NET Framework编译器编译成机器代码,被操作系统识别。

C#是跟随.NET的开发工具Visual Studio一起发布的,在安装Visual Studio时是把.NET Framework框架一并安装的,所以C#的版本是跟随.NET Framework的,换句话说C#语言本身没有单独版本之说,和.NET框架版本同步。

在同一台机器上可以同时存在不同版本的.NET Framework,互不干扰,正常运作。

微软产品的特性:高版本兼容低版本,向下兼容。

c# 跟.net Framework不是一个概念。另外我们通常说的版本都是指.net framework的版本。

不过c#语言本身也有版本之分。

像PHP一样,PHP7比5是语法上有提升,然后解释器不一样。C#的版本是和VS绑定的。VS就是个解释器,也会识别新语法。

C# 7.0
2017 年 3 月
随 Visual Studio 2017 和 .NET Framework 4.7 发布
C# 6.0
2015 年 7 月
随 Visual Studio 2015 和 .NET Framework 4.6 发布
C# 5.0
2012 年 8 月
随 Visual Studio 2012 和 .NET Framework 4.5 发布
C# 4.0
2010 年 4 月
随 Visual Studio 2010 和 .NET Framework 4.0 发布
C# 3.0
2007 年 11 月
随 Visual Studio 2008 和 .NET Framework 3.5 发布

语法

int a = 100;
a++和++a对于a来说都是一样的值,都是101

int b = a++ 和 int b = ++a对于b是不一样的。前者是先返回再加,后者是先加后返回。所以b分别是100和101

byte范围为0-255
short范围为-32768-32767
byte类型相加,结果为int
short类型相加,结果为int

int=byte+byte
int=short+short
int=short+byte

byte与short相互参与运算,运算的结果为int类型。
为什么?因为byte和short的存储范围比较小,byte与short相互参与运算的时候经常超出范围,所以微软规定,结果都为int类型。

关于范围:
整型的数据范围比较:long>int>short>byte
浮点类型的范围一定比整型大
浮点型的数据范围比较:double>float>decimal
(精度与范围无关,精度比较decimal>double>float )
3、string类型无法参与算术运算,只能进行字符串拼接
4、参与算术表达式的类型只能是数值类型和char类型
5、char类型参与运算的时候,会转换成ASCII码(在线转换的链接: https://www.qqxiuzi.cn/bianma/ascii.htm)
6、decimal不能与其他浮点类型的变量进行运算,因为会丢失精度

int是个类型,像new Class1一样
int[] arr1 = new int[8];
int[] arr2 = new int[] { 1, 2, 3 };
int[] arr3 = { 5, 6, 7, 8, 9 };

数组的三种写法,遇到这种写法多的时候就确定用一或两种。第三种是对第二种的简化,所以就使用1,3就行。看第一种new int,就知道int是个类。然后和Class1,Delegate一样的。

C#数组存在的问题是长度固定。

硬件

硬盘的读写效率取决于磁盘的转速。
买硬盘的衡量标准在于容量和转速。
为什么内存比硬盘快?
内存的数据存储在电子元件里面,直接读取与写入,效率比硬盘高。
为什么系统装在C盘?

垃圾收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections;
using System.Collections.Generic;

namespace Test
{
//垃圾回收
//CLR只回收栈里面的内存
//垃圾回收是回收堆里面的内存
//垃圾回收是定期启动的,但是具体什么时间回收没办法确定
//如果确定垃圾很多,那么可以手动调用垃圾回收
//注意:垃圾回收是很耗费性能的,所以不能频繁的调用
class Program
{
static void Main(string[] args)
{
//Tool tl = new Tool();
//tl = null;
////手动调用垃圾回收
//GC.Collect();

//装箱与拆箱
//装箱:把任意的变量的值赋值给object类型的变量
int num = 100;
object obj = num;
//拆箱:把object类型的变量转化为对应类型的变量
int theNum = (int)obj;

string str = "www";
object objStr = str;
int strNum = (int)objStr;

ArrayList list = new ArrayList();
list.Add("www");
list.Add(true);
list.Add(55);
object count= list[0];
//int s = (int)count;//报错
}
}
}

委托

委托作为一个方法的参数时,给这个方法传参时隐藏了委托赋值的过程。这个传参可以使用Lambda表达式。

此时如果需要使用多播委托,则需要连续调用这个方法。

举例如下:

1
2


0%