作者学习 C# 这门语言的目的性非常强:掌握足够应对游戏开发编程的内容,涉及 .NET 框架本身的知识对我们并不重要。
骂人:
说个事,有个网站 www.233tw.com 不要脸转我文章还不标出处,这种没有丝毫版权意识的人还想做游戏,大家品一品嗷。不屑于为此生气,因为他不配,就祝宁的游戏上架第一天被破解好了~
最近看到了 Unity 大学的广告,这是个官方推出的培训实体课,看了一下他们的学习内容,又看了看价格,算了算了,感觉一半是智商税。
下面是 Unity 大学广告给出的 C# 部分授课清单:
看了这~~么长的清单我也是醉醉的,有一种强行凑数的感觉;不过既然他们按这个教,我们就假设学了这些就够用好了,本次爆破计划也(大体上)按照这个来写。
C#(读作“c sharp”)是微软主导研发的通用编程语言,之所以名字里带 C 是因为它语法风格跟 C++ 很像,名字里带“#”这个诡异的符号,则是因为它的设计者觉得这是比 C++ 更 ++ 的语言,然而实际上也就那样吧,不黑也吹不起来。
作者是 C++ 背景,也假设你有一点点 C++ 知识,因此有些过于常识性的说明会略过。
C# 声称其具有的特点:
C# 未声称但确实具有的优点:
C# 未声称但确实具有的缺点:
以上均为杂谈,除 C# 的读法外,没有任何值得记忆的知识点。
以下补充俩知识点:
.cs
,没有头文件的概念。.NET 是微软主导研发的编程框架,它允许我们用 C#(首选语言)、Visual Basic Roslyn、C++ 等各种语言编程。之所以能够做到“语言不敏感”,是因为使用了虚拟机技术,将所有语言都编译成 IL 中间语,说白了就是一个操着各种方言的 JDE,概念上是非常伟大的。
它包括这些部分:
此外,.NET 框架的所有实现都内置各种语言(至少是 C#)到 IL 的编译器。
在 .NET 的概念与规范下,产生了 Microsoft .NET Framework(最古老最成熟的闭源 Windows 独占开发框架,雨女无瓜)、.NET Core(微软主导开源运营的新型框架,并且由微软积极推动跨平台)和 Mono(开源第三方框架,理念上推动跨平台,后由微软运营,但保持开源,诞生比 .NET Core 早很多)三大生态系统,它们都是 .NET 的具体实现。
目前 Unity 采用的就是 Mono 框架,通过其产生 IL,再经由 Unity 自研技术 IL2CPP 将 IL 转译为 C++ 代码,最后再在各个平台上用原生 C++ 编译器产生该平台下的原生客户端程序,从而(极为曲折地)实现了跨平台与执行效率的兼得。
每天一个小问题:
- 既然最后还是用 C++ 实现跨平台的,为什么不直接用原生 C++ 作为 Unity 的开发语言?—— 你问官方啊,我也想知道;
- 以后 Unity 会转用 .NET Core 吗?—— 关心这个没有任何实际意义;
- 那 Unity 能用 VB 开发吗?—— 理论上可以用易语言开发,实际上你还是得学 C#。
Covers:对象与基本操作
学习 C# 不一定非得安装巨大的 Visual Studio,可以只 安装 .NET Core 并配合 IDE,如 VS Code 或作者比较喜欢的 JetBrains Rider。
.NET Core 是傻瓜式安装的,完毕后打开一个 cmd 运行命令 dotnet --info
确认安装成功,再安装喜欢的 IDE,环境就搭建完毕了;
如果安装 Visual Studio,需要确保“.NET 桌面开发”这个工作负载安装完整,可选项目建议选中“.NET 分析工具”和“实时调试器”。
通过 IDE 新建一个控制台项目;如果你用 .NET Core,那么也可以用命令行完成:
cd
到将要存放工程目录的父目录;dotnet new console -o 工程名
,等待完成(初次运行这个命令可能会卡住一会儿,耐心),就会在当先目录下创建与工程名同名的子目录,这就是我们的工程目录;工程名.csproj
就是工程的管理文件,用 IDE 打开即可打开整个工程。
- 如果用 IDE 创建工程,可能会产生一个
.sln
文件,这是解决方案的管理文件,在 Unity 开发中也会遇到。现阶段没什么用(因为解决方案里也只有一个工程而已),与.csproj
文件起到同样的功能;dotnet
命令只有 .NET Core 才有,如果用 Visual Studio,它安装的是 .NET Framework,就老老实实用 IDE 来完成各种操作吧。
在工程目录中找到 Program.cs
这个源码文件,它就包含了程序的入口方法。打开该文件,删掉所有内容,手敲下面的代码(没错,其实跟原有内容差不多,但手敲一遍也许能加深记忆):
// File: Program.cs
using System;
namespace 工程名
{
class Program
{
static void Main(string[] args)
{
// Console print:
Console.WriteLine("Hello World!");
Console.Write("What's your name? ");
// Console read input:
string name = Console.ReadLine();
// Console print with string combination:
Console.WriteLine("Hello, " + name + "!");
// Wait for a key press, then exit:
Console.ReadKey();
}
}
}
接着构建工程,用命令行的方法是:
dotnet build
等待完成。在命令行输出内容中有产生的可执行文件位置,给出的是一个 dll 文件,而同名的 exe 文件就在同一位置:
...
HelloWorld -> (工程目录)\bin\Debug\net5.0\HelloWorld.dll
已成功生成。
0 个警告
0 个错误
运行观察效果,可以直接打开产生的 exe,也可以命令行执行:dotnet run
。
知识点:
//
引导行注释,/**/
包围注释;using
引入依赖,我们这里依赖了 System
这个命名空间,有了它才能操作控制台;namespace
定义命名空间,最好与项目名一样,我们自己的代码全都包括在这个命名空间中;class
定义类,C# 硬性要求用类包括程序的入口函数;static void
函数,函数名为 Main
,区分大小写,括号中的形参 string[] args
用于接收运行参数,现在还用不到,因此也可以留空;Console
类完成;.
调用对象的方法或类的静态方法;+
拼接。方法:
Console.WriteLine
:控制台打印并换行;Console.Write
:控制台打印但不换行;Console.ReadLine
:从控制台读取一行用户输入,当用户回车时返回读取到的字符串;Console.ReadKey
:从控制台等待用户按下某个键,返回用户按下的键,在这里用于卡住控制台,避免直接运行 exe 文件时程序一闪而过。进一步深挖一点,看不懂可以忽略:
Console
是个类,但这里没有它的实例,原来它是一个 静态类,静态类不能实例化,其所有方法都是静态的;Program
其实也可以定义成静态类,在 class 关键字前用 static
修饰即可,编译运行效果一样。T.B.C.