0%

距离上一次更新竟然过去了一个半月。倒也不是我不想写,每当念起时总有些“俗事缠身”。而当处理完这些事,我要么是没有安静的适合写作的环境,要么便是只想躺平刷微博,失却了敲键盘的热情。

今天终于得闲,慢慢地来记几笔吧。

五月初,我终于得知毕设deadline的确切日期已经不远,而且那时我的春招战果虽不算好,但总归拿到了保底的offer,唯一要做的就是赶进度了。To Do List上的待办事项随着Commit被勾掉一些,那时我充满热情,状态是相当理想的。我又满怀兴奋地购入一堆技术书籍——不必说,它们自然还是没有被翻过几页。

我的Unity终于有了点入门的感觉,开发就像华科的施工队般“日新月异”。为了保持这种节奏,毕设所需要写的那些形式上的文书之类一度令我深恶痛绝,但很快我就从中感受到了回顾与总结既往工作的乐趣,这项杂务实际上是大有裨益的,让人能暂时跳出“此山中”,不至于沉迷于手头的问题而“不见庐山真面目”。

到了线上答辩的时刻,大家的课题多是大型分布式系统或者机器学习等等非常“Computer Science”的内容,我的《基于Unity的东方Project同人ARPG游戏设计与开发》无论什么时候都那么格格不入。偏偏我的答辩排在最后几位,只好先接受了数个小时的天书洗礼。

阅读全文 »

不可避免地,这两天被《后浪》刷了屏。

看到后浪二字,我一开始想到的是那家后浪出版公司。我还在读《vista看天下》时,这家出版公司就有许多存在感。虽然知乎上只看梵语原著的大佬们将其打为营销号的同类,但我至少认同他们在选书和装帧上的天分。对于一家出版公司,这好像也就是最重要的:把那些有趣有用的书以亲近可人的姿态送进大街小巷的书店,让那些或许仅仅是为刻奇所驱使,亦或许真正识文解意的爱书人,能够看到那个熟悉的图标就忍不住算算自己的余额。

显然,我是属于前一种“爱书人”。也许上次去书店我抽出了《山海经校注》,这次我找来了一本《中国神话史》,下次还要考虑着把那套《火鸟》扛走……但是实际上堆在桌上,自己经常翻看的还是诸如《C#高级编程》和《Unity 5.x从入门到精通》之类,“科技类图书四大社”的俗套玩意。

噢,不——在那堆东西里甚至还夹着一本没翻过几页的《日本书纪》。

冠位十二阶 宪法十七条

阅读全文 »

数组可以说是在任何语言中都非常基本的数据结构了。这篇笔记以C#中的数组为引,再延伸到C#的几种集合类(Collections)以及一些相关的基本概念。

数组 Array

概述

数组存储相同种类的元素,其大小固定,且是顺序存储的,即在内存中占据一段连续的地址。

数组作为一种引用类型(其基类是System.Array),需要用new来创建实例。

1
2
3
4
5
//初始化时指定大小
double[] balance = new double[10];

//可以直接赋值来初始化
int[] marks = {99, 98, 92, 97, 95};

初始化而尚未赋值的数组,编译器会根据其类型隐式地将所有元素设置为默认值。

数组最大的特点还是能够用下标索引来随机访问其中的元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double salary = balance[9];

//以下是C# 8.0引入的好东西!

//末尾运算符 ^
//[^n]表示[length-n],类似Python用负数索引[-n]表示[length-n]
double salary = balance[^1];

//范围运算符 ..
//[a..b]表示从[a]到[b]的范围(但不包含[b]!),类似Python的切片[a:b]
//省略a代表0,省略b代表^0
double[] salaries1 = balance[..^3];
//如果a比b还大,会抛出异常(Python中则是返回空列表)
double[] salaries2 = balance[3..2]; //ArgumentOutOfRangeException
//a和b一样大时,返回长度为0的集合
double[] salaries3 = balance[3..3];
Console.WriteLine(salaries3.Length); //0

由于实现了IEnumerable接口,数组可以使用foreach...in...的方式进行迭代访问,还可以使用LINQ,这样就无需获取数组长度再用for循环迭代了。关于这个接口及其相关的内容,我在本文稍后的部分记述。

阅读全文 »

前方高能!
这篇笔记断断续续花了近10天,思路、结构较为混沌,如果没有充分做好心理准备,建议立刻关闭窗口。
(其实就是我写完实在不愿审阅)

首先说明,异步是极为高深的高级编程技术,这篇文章只是才疏学浅的我阅读文档之后的一些思考与理解,可能有极多描述不准确乃至完全错误之处,还望批评指导。顺便吐槽,C#文档翻译得实在是太烂了,很多地方一看就是机翻的,却没有机翻警告。很多地方百思不得其解的词,切换到英语就发现其实很简单,翻译的用词完全错误,难受啊!

何为异步

与异步相对的是“同步”,代表着一句代码的执行结束是其后一句代码的执行开始,整个流程是按照固定的顺序进行的,这是一般程序的逻辑。然而,某些语句可能需要花较长时间才能得到结果——比如网络通信和文件读写——这些语句的执行并不怎么占用CPU,但会阻塞整个线程,后续的语句需要等待这些语句执行完成,造成大量的浪费。特别是如果网络环境很不好、读取的文件好几个G,那可是尤其要命,可能整个程序都会出现肉眼可见的卡顿甚至崩溃。

为了解决这种飞快的CPU与龟爬的IO之间的不平衡,传统的方案是单独开个线程让它去执行耗时的操作,让主线程继续运行与耗时操作的结果无关的代码。但是线程操作很麻烦、开销很高,线程数量也有限,不是能随便使用的,所以依然不是个完美的方法。

异步就是为了解决这个问题而存在的。当代码需要执行一个耗时的操作时,它只发出指令,并不等待结果,然后就去执行其他代码了。一段时间后,当耗时操作返回结果时,再通知CPU进行处理。

阅读全文 »