C# 101
C# 是什么
C# 是微软推出的基于 「.NET 框架」的「面向对象」的高级语言,读作 C Sharp(因为 # 是音乐里升号的意思)。Unity 优先使用 C# 进行开发(Unity 也支持使用 JavaScript 开发,但是资料少、不好用)
- .NET 框架(.NET Framework):微软提供的一系列的类库,包含很多基础和常用的「类」与「方法」。甚至像 string、int 这些变量的「类型」都是由 .NET 提供的「类」来实现的。
- 面向对象的编程(Object-Oriented Programming):面向对象仅仅是一种思维模式,即以「对象」的思维模式来思考、解决问题。你可以理解成这是一种哲学、以及哲学对应的方法论。一门编程语言如果实现了这个哲学和方法论,那么就可以称之为支持面向对象的编程语言。
准备环境
虽然这是一门微软维护语言,但是有一个叫做 mono 的组织致力于以「开源」的方法实现 .NET 框架标准,并提供一个「编译器」。因此你可以在包括 Linux 和 macOS 内的操作系统上使用 C# 来进行编程。
- 开源(Open Source):即开放程序所有的源代码(Source Code),同时会附带像 GNU、MIT 这样的协议来规定用途和传播。
- 编译器(Compiler):是一个程序,可以把程序的源代码(由人编写)编译(Compile)为机器可以执行的机器码
编辑器(Editor)
image默认只提供查看、编辑、查找文件等基本功能的软件,记事本、Sublime Text 都是编辑器。你可以先新建一个后缀为 .cs 的文件,再手动在「命令行」中调用 mono 提供的编译器把源代码编译成可执行的 .exe 文件。
命令行(Command Line)
image在没有图形界面(GUI)的时候,电脑最初的操作界面(Interface)。在 macOS 中可以通过终端(Terminal)软件来启动一个命令行界面。命令行界面接受输入一行命令(这种命令的语言、操作方式被称作 Shell),并返回结果。一个没有图形界面、只能通过命令行操作和显示的应用叫做命令行应用(Command Line Application)。Windows 下的命令行终端叫做 CMD(Command),还有一个 Windows 官方更好的命令行终端软件叫做 PowerShell。命令行界面这样的操作形式也被称作控制台(Console)。
通过编写命令行应用来学习一门编程语言是效率最高也是最简单的,因为你不用考虑复杂的图形界面设计、按钮等元素的交互逻辑。
使用命令行,相当于以一种更加直接的方式来操作电脑,在 Linux 和 macOS 下,一些常见的命令行命令包括:
- ls(List):列出当前目录下的所有目录与文件
- cd(Change Directory):移动到指定目录下
- rm(Remove):删除文件或者目录
- open:打开文件
在命令行中编译与执行程序
image如果你已经在 mono 官网下载并安装了 mono 环境(http://www.mono-project.com/download/),那么你已经可以在终端中执行下面的命令:
mcs Program.cs
编译代码,生成一个 Program.exe 文件,再:
mono Program.exe
执行程序(因为 macOS 等 Windows 以外的系统没有办法直接执行 exe 文件)
IDE
IDE 是集成开发环境(Integrated Development Environment)的简称。从结果上看,可以简单理解成一个启动慢、占用资源多,同时功能也很多的编辑器。通过 IDE,基本上可以通过点菜单上的按钮就可以进行「编译 + 执行 + 调试」的全部工作。如果你安装了 Unity,那么已经自动为你安装了 mono 提供的 IDE:MonoDevelop。
直接打开 MonoDevelop,新建一个 Console App 项目,再点击像播放按钮一样的执行按钮,就一步完成了「编译 + 执行」的工作。Mono 会在下方为你启动一个命令行界面来显示结果。
在调试 Unity 项目时,一些临时变量不可能打印到真实的软件界面中,因此通过控制台(Console)来调试是十分方便的。
第一行代码
namespace CUC.DigitalArt
{
class Program
{
static void Main()
{
System.Console.WriteLine("Hello World!");
}
}
}
这段程序的效果是在命令行中打印出 Hello World! 这句话。一切 C# 程序进行的操作本质上就是调用一个又一个「方法」,而「方法」内又可以调用别的「方法」。
观察这段程序,可以发现整个程序被分成了三个嵌套的部分:
- namespace 为 CUC.DigitalArt:即「命名空间」是 CUC.DigitalArt
- class 为 Program:即「类」名是 Program
- class 里有一个 static void Main():即「类」里有个「方法」名是 Main
三个部分各自用一对花括号({})来标识自己的范围,一个 C# 程序的项目的结构可以是这样的:
- 一个项目里有很多 C# 程序文件(.cs)
- 一个 C# 程序文件里有很多命名空间(namespace):一般整个程序只会有一个命名空间
- 一个命名空间里有很多类(class):一般一个文件里只有一个类
- 一个类里有很多方法(method)和其他成员(member):在上面这个例子里,Program 这个类里只有一个 Main 方法成员
命名空间(Namespace)
「命名空间-类-方法」是「方法」的全名。如果我的房间有个方法叫做「开门」,那么我需要通过「中国传媒大学动画学院」「106教室」来定位到(106教室的)「开门方法」,在上面这段例子中:
System.Console.WriteLine("Hello World!");
这一行代码里,WriteLine 是方法名、以点(.)分隔,左边的 Console 是类名、再左边的 System 是命名空间。
如果你在代码的开头使用了 using 语句,那么整个文件里都不需要再次出现这个命名空间了,比如上面的程序可以写成这样:
using System;
namespace CUC.DigitalArt
{
class Program
{
static void Main()
{
Console.WriteLine("Hello World!");
}
}
}
为自己的程序起一个命名空间是便于他人引用的习惯,没有 CUC.DigitalArt 这样的命名空间,别人的程序里就不能用 Program 作为 class 名了
类(Class)
类是面向对象编程的基础,任何方法、变量…都一定会依附在一个类上,正如同 WriteLine 方法依附在 Console 类上一样。我们会在面向对象概念的学习中,了解到类的更多使用方法。
有关类最基本的理解是,类是对象的模子,对象(Object)是类(Class)实例化(Instantiate)出的实例(Instant)
方法(Method)
方法就是 C# 里在其他语言中提到的函数(Function),是一段可以通过输入参数、被重复调用的代码。
声明方法
using System;
namespace CUC.DigitalArt
{
class Program
{
static void Main()
{
string input = Console.ReadLine();
int inputNumber = int.Parse(input);
int result = Adder(inputNumber, 1);
Console.WriteLine(result);
}
public static int Adder(int x, int y)
{
return x + y;
}
}
}
修改这段程序,在 Main 方法以外又声明了一个 Adder 方法。Adder 方法的作用是把传入的两个参数 x 和 y 相加并返回结果。观察 Adder 方法的声明过程,一共有六个部分:public
、static
、int
、Adder
、(int x, int y)
和 { return x + y;}
,他们分别是「访问修饰符」、「修饰符」、「方法返回类型」、「方法名」、「方法参数」和「方法体」
- 访问修饰符(Access Modifier):有三种值,分别是 public、private 和 protected,代表了这个方法是否可以被这个类以外的类调用
- 修饰符(Modifier):static 本身也一个是修饰符,代表这个方法是个「静态方法」,这个方法不需要自己所在的类被「实例化」就可以直接调用。如果不加以声明,那么默认声明这个方法是个「实例方法」,意味着这个方法必须通过所在的类实例出的对象来调用
- 返回类型(Return Type):方法返回的对象的类型(Type)。类型在 C# 中和类是一个概念,int 是个类型、也是个类,Program 是个类、也是个类型
- 参数(Parameter):执行方法时通过传入不同的参数,可以让方法返回不同的结果
- 方法体(Method Body):在花括号内实际将要执行的代码。顺带一提,Class Body 就是指类下方的花括号里面的内容
通过「修饰符 修饰符 返回类型 方法名(方法参数){方法体}」这些一起来声明了一个方法。并不是所有的修饰符都是必须的,如果没有主动声明修饰符,那么方法会默认设置修饰符的值。
一个类中的 Main 方法是会被第一个执行的,在一个程序中也往往只会有一个 Main 方法。一般没有返回值,因为我们把 Main 方法的返回类型设置为 void
调用方法
在方法名后使用一对括号 ()
来调用,同时还可以在这个括号中传入方法需要的「参数」,就好像 Console.WriteLine("Hello World!");
做的那样。
- Console.ReadLine 方法会返回一个 string 类型的值,所以我们准备了一个 string 类型的变量 input 来保存输入的值 "41"
- 因为 string 类型没有办法像我们预期的那样和 int 作加法,所以我们使用 int.Parse 方法来把 string 类型的 input 变成 int 类型的 inputNumber,变成了数字类型的 41
- Adder 方法会返回一个 int 类型的值,所以我们准备了一个 int 类型的变量 result 来接受 Adder 返回的结果,得到 42
- 最后再调用 Console.WriteLine 方法把最终的结果 42 打印在屏幕中
以上的例子就是 C# 基本的语法和简单的说明,接下来就可以进入到面向对象部分的理解了。解释永远不可能完善,这意味着你需要在遇到任何不太清楚的概念时都立刻查清楚、想明白这些词是什么意思。为了获得高质量的答案,你需要:
- 准备好翻墙的方法
- 使用 Google 作为默认的搜索引擎
- 学好英语
再次推荐阅读 treehouse 网站提供的 C# 课程,视频、图文、题目应有尽有:https://teamtreehouse.com/tracks/learn-c