Stopwatch Class
位于命名空间 System.Diagnostics 下的 Stopwatch 类提供了简单的秒表功能. 用法很简单:
using System.Diagnostics; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); // ... stopWatch.Stop(); // 输出运行所需的毫秒数 Console.Write(stopWatch.ElapsedMilliseconds.ToString());
如果想获得多个时间间隔可以这样
Stopwatch stopWatch =Stopwatch.StartNew(); // 直接创建实例并开始计时
/*
* Some methods
*/
long first = stopWatch.ElapsedMilliseconds; // 获取第一个时间间隔
/*
* Some methods
*/
stopWatch.Stop(); // 结束计数
Console.WriteLine("第一名时间: " + first.ToString());
Console.WriteLine("第二名时间: " + stopWatch.ElapsedMilliseconds.ToString());
部分成员
方法:
GetTimestamp 获取计时器机制中的当前最小时间单位数
Reset 重置当前实例的运行时间为零
Start 开始或继续测量运行时间
Stop 停止测量运行时间
字段:
Frequency 只读, 获取以每秒计时周期数表示的计时器频率, 取决于基础计时机制的分辨率, 高分辨率性能计数器优先
IsHighResolution 只读, 指示计时器是否基于高分辨率性能计数器, 基于高分辨率性能计数器则返回 True, 反之返回 False
Freqiency 和 GetTimestamp 可以用于替换非托管 Win32 API QueryPerformanceFrequency 和 QueryPerformanceCounter
属性:
Elapsed 获取当前实例测量得出的总运行时间
ElapsedMilliseconds 获取当前实例测量得出以毫秒为单位的总运行时间
ElapsedTicks 获取当前实例测量得出用计时器计时周期表示的总运行时间
IsRunning 获取当前实例是否正在运行的值
在多处理器计算机上,线程在哪个处理器上运行无关紧要。但是,由于 BIOS 或硬件抽象层 (HAL) 中的 bug,在不同的处理器上可能会得出不同的计时结果。若要为线程指定处理器关联,请使用 ProcessThread.ProcessorAffinity 方法。
.Net 3.5 Extension Methods
Extension Methods / 扩展方法是.Net 3.5添加的一个新特性
在不修改原有类或接口的基础上可以对其进行扩展, 添加方法:
static class Ext
{
// 第一个参数是指示把这个扩展方法添加到哪个类上, 后面可以接参数列表, 规则和一般方法一样
public static void Say(this string str, string words)
{
// 输出 "Hello! Ys Chris"
Console.WriteLine("Hello! " + str + " " + words);
}
}
static void Main(string[] args)
{
// 需要一个实例来调用扩展方法, 无法用 string.Say() 调用
string str = "Ys";
str.Say("Chris!");
Console.ReadKey();
}
对于一些类在无法修改的情况下, 比如通过 dll 调用时, 之前的版本多数会独立写一个新类, 而现在只要一个扩展方法即可, 虽然代码上仍然是两个类 (包含扩展方法的静态类), 不过逻辑上只是一个类, 通过 class1.method() 调用, 而不是 class2.method() 处理完再扔回给 class1, 比如可以参考微软官方例子 — 为 String 添加一个计算除空格, 句号和问号外的字数
扩展方法的规则:
- 包含扩展方法的类只能是静态类, 扩展方法的访问修饰符必须是 public 或 internal, 因此可以被子类继承
- 如果存在同名实例方法则扩展方法永远不会被调用, 比如给 string 扩展了 ToString() { // output “Hello World” }, 在调用 “我是字符串”.ToString() 时, 仍然是输出 “我是字符串”. 而即使是相同的扩展方法, 命名空间内的方法优先于命名空间外的方法
- 第一个参数必须有 this 关键字, 扩展的类不能为指针类型. 编译器会为 this 关键字隐式添加 ExtensionAttribute 属性, VB.net 是直接加入 ExtensionAttribute 属性来定义扩展方法, C# 中不能.
- 同一个静态类中可以有多个给不同类型扩展的扩展方法, 但不支持属性或事件等
网瘾少年为了反抗家长自断左手
强强的母亲说,家里经济条件不是很好,但夫妻两人工作都很努力,一心想把学习成绩较好的儿子培养成材。为让儿子学习计算机,不久前她为强强买了一台电脑。 谁知学习努力的强强从此像变了个人,再也不爱读书了,经常趴在电脑前,玩起游戏来就忘乎所以。成绩从此一落千丈,怎么说他也不听。强强正值青春期,性格非 常叛逆,家长对他批评得越狠,他反抗得越厉害,玩游戏的时间也就越长。 via 网瘾少年被母亲打扰 一气之下自断左手
典型的生了又不教育的家长
强强妈妈想培养儿子学计算机, 可是有培养他的兴趣吗?
如果有正确引导强强怎么区分学习和娱乐, 会有今天断手的事情吗?
一味去否定孩子, 一味去责骂孩子, 却不去耐心引导, 当然会反抗
这我是深有同感, 毕竟当年我也处于差不多的情况
我爸经常说我只会玩游戏, 我反驳他: 我啃技术书时, 啃代码时你在哪? 为什么刚好我玩游戏放松的时候被你看见了你就这样否定我?
因此考大学的期间, 没少和父母吵架, 那段日子很不愉快, 在他们眼里, 我是非常地 “固执己见”
之后刚过了大一, 我就过了国家软考, 全级只有我一个过了, 级排名第一的同学在代码题上失分严重, 不过这个证也很垃圾, 现在根本看不上眼
事后有一次老爸开车送我, 一路话不多, 父子两一直都这样, 呵呵
突然老爸开口: 儿子啊, 还好老爸当年没硬逼你, 老爸后悔当年没支持你
我听了后无言以对
是的, 其实对于这点, 我可以说的是, 如果当年有父母的全力支持, 我会少走很多弯路
有朋友问过我, 如果你的孩子坚持学自己喜欢的东西, 不看重文凭或者不愿意读书, 你怎么办?
我当时是这样回答, 以后也不会变:
我不会阻止他, 我会为他收集一切相关的资料, 包括学习计划, 学校或培训地点, 职业生涯, 等等与之有关的
然后以自己的社会阅历来告诉他走这条会有什么困难, 该怎么走比较好
我大概会这样说: “XX大学这个专业比较有名, 可以考就考, 考不到最起码给我考oo大学, 大学的课程有几门知识是你那个专业必须的, 应该学. 不要求你100分, 只要求你能获得挑战梦想的必须能力. 你要玩游戏可以, 先把你为实现目标该做的事做完了再玩, 玩多久都行.”
我足够幸运的, 母亲虽然不喜欢我走自己选的路, 但没有阻止我, 而是默默在背后支持我
所以我没去断手 (笑
我也不会埋怨当年为什么没人为我分析我选的路对不对, 也不会后悔
因为我母亲的教育很成功
我沉迷于计算机世界, 但不沉迷于网瘾
腾讯QQ/TM的filter很有趣
当我们最心爱的小蓝鸟离开时,我们大叫“草泥马”,结果千千万万个大波诞生了
这是在 twitter 上看到的, 觉得有意思就打算放在QQ/TM上, 结果嘛

失败了, 这不是我的网络问题, 是filter起作用, 腾讯直接让你失败, 不提示你被水产
既然是水产, 那就找关键字吧, 最后试出是 “大波” 二字被水产了:

然后我突然对腾讯的filter起了兴趣, 就开始测试该filter的性能, 如图:

经过重复测试, 得出一个结论:
腾讯QQ的过滤器判断时仅匹配中文字, 所有非中文字会被去除, “大〖波“, “大d波” 等均会匹配成功, 只有 “大小波” 之类并不在黑名单的没事. (测试平台 TM2009 Beta 750)
不过很有趣, “sexy“, “fuck” 不会水产, “大波” 会水产, 而 “小波” 却没事
PS: 虽然我QQ在线时间最长, 但不是最关注的 IM, 所以未免麻烦就打格子了~
Emacs 入门 — 基础键盘命令/快捷键和注意事项
阅读前请先记住以下几点:
- 解说按键组合命令时除 CONTROL / META / EDIT / ALT / SHIFT 等键需按住不放外, 其余按键无特别说明均需释放. C-v 表示按住 CONTROL 不放再按下 v, 然后松开; C-u 10 C-f 表示 按下 C-u 后松开, 输入 10, 再按下 C-f 后松开.
- 用 < > 包裹的一般指英文和标点字符按键或特殊名称, 常用按键如 CONTROL, SHIFT 直接大写处理.
- <Return> 指按下回车键. <chr> 为任意字符, 如 “a”, “b”, “g”, 标点, 区分大小写.
- N 指任意数字.
- 命令中需要输入的名字或路径均不需要引号 (”", ”) 包裹住, 如 C-x C-f C:\test.txt 打开 C:\test.txt, 路径根据平台特性输入.
- 以下内容基于 Windows 平台, Emacs 大部分特性与平台无关, 有区别的多数在操作上, 如组合键.
基础知识:
Emacs 键盘命令 (即快捷键) 通常是以以下方式来组合:
C-<chr> 和 M-<chr>
C 即 CONTROL 键.
M 即 META / EDIT / ALT 键, 三键效果相同, 亦可以按一下 ESC 键后放开模拟 META 键, 如 C-M-v 等效于 ESC C-v. META 键组合的执行的操作一般是 CONTROL 键组合的反向操作.
通常组合键都有对应的命令名, 如 C-h ? 打开帮助列表 等效于 M-x help<Return>, M-% 替换模式 等效于 M-x query-replace<Return>.
大部分时候都可以使用 <Tab> 来补全命令名, 文件名等等, 如果没有唯一的补全项, 则会新打开一个窗格显示以关键字为开头的命令列表.
命令集扩展:
C-x 字符扩展, 用于和字符或组合键组合命令, 如 C-x C-f 打开文件
M-x 命令扩展, 用于执行特定命令. 如 M-x set-language-environment 设定语言环境, 输入完命令名需要按 <Return> 执行.
C-x C-c 退出 Emacs
C-z 挂起 Emacs, 以便使用 shell.
Win 图形界面版效果为最小化 Emacs; 控制台下为挂起 emacs, 根据系统支持决定, 返回命令一般为 “fg” 或 “%emacs”, 不提供挂起功能的系统, 会在 Emacs 下创建子 shell, 使用 “exit” 回到 Emacs
文件和缓冲区:
C-x C-f 寻找文件.
底部 minibuffer 区会显示 Find file: <Default path> , 可以自定输入完整路径, 如 D:\test.txt, 也可以输入目录路径, 如 D:\, Emacs 会列出目录, 在这个窗口里可随意浏览硬盘. 如果输入文件名后, 指定路径不存在该文件, 则在 buffer 区创建, 保存后才正式创建文件. 可以直接使用 C-x C-f 打开其他文件, Emacs 会自动创建新 buffer, 不会替换掉已打开文档, Emacs 是 “强制” 多文档同时编辑.
C-x C-s 保存当前文件.
默认会创建备份, 使用 M-x customize-variable <Return> make-backup-files <Return> 关闭备份.
C-x s 保存所有文件, 会逐个询问是否保存.
C-X C-b 列出缓冲区列表.
通常缓冲区内的名字和文件名一致, *Messages* 等缓冲区是系统缓冲区.
C-x b <File name> 跳转到已打开的指定文件.
M-x recover-file<Return> 从指定自动保存文件中恢复原有进度.
先打开原始文件再使用此命令, 自动保存文件名字一般为 “#file name#“
在开始编辑文档前, 请记住以下命令:
M-x set-default-font<Return> <Font name><Return> 设置默认字体.
字体名可以简写, 如 tahamo, 宋体, Emacs 会自动搜索, 如果输入 <->, 则会有一个超详细的字体列表. Emacs 理论上不存在乱码问题, 各类编码文档可直接打开, 如果遇到乱码, 请选择合适的字体.
M-x set-language-environment<Return> <Language name><Return> 设置语言环境.
通常会自动检测 OS 环境, 有特殊需要可更改, 直接输入 English 等即可.