玩转C科技.NET

从学会做人开始认识这个世界!http://volnet.github.io

导航

区域性和变量名:编码的中文世界

写本文倒不是说明本文所谓的可行是值得推荐的,而是说它是对的。
倒是希望您能够顺带学习一下MSDN中ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/dv_fxdesignguide/html/87a4b0da-ed64-43b1-ac43-968576c444ce.htm链接中所提到的一些变量命名的规则。
其实我一直不相信本文的内容是对的,但是事实胜于雄辩。从上大学的第一门专业课开始到现在所有关于变量名或者标识符的说明中总是能见到“变量名的第一个字符必须是字母、下划线”,刚才特地打开了C#入门经典一书,找到了C# 版本的相关语句“变量名的第一个字符必须是字母、下划线或@”(Page30,中文第三版)。但估计这些书籍都是外国直译过来的,由于老外也不考虑外籍文字的缘由,这些特性在所谓的“中文版”中也没有提及,加上国内一些教材出于“通用性”的考虑(或许如此),也就出现了打开几乎所有的书本都出现了如上的定义。
给出下面一段代码,相信大家就知道我刚才所说的是什么了:
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace DotNet与区域性文字
 6{
 7    public enum EnglishType
 8    {
 9        Car,
10        Bus,
11        Bike
12    }

13
14    public enum ChineseType
15    {
16        汽车,
17        公交车,
18        自行车
19    }

20
21    public enum 中文
22    {
23        汽车,
24        公交车,
25        自行车
26    }

27
28    public class 中文类
29    {
30        private int 中文数值 = 20;
31        //private int 1个错误的变量名 = 30;
32        private int 繁體中文數值 = 30;
33        private string ショッピング = "从日本雅虎拷的一段日文";
34        public void 输出结果()
35        {
36            Console.WriteLine("可以使用中文作为变量名:中文数值=" + this.中文数值);
37            Console.WriteLine("可以使用繁體中文作为变量名:繁體中文数值=" + this.繁體中文數值);
38            Console.WriteLine("可以使用日文作为变量名:ショッピング=" + this.ショッピング);
39            Console.WriteLine("可以使用中文作为类名和方法名!");
40        }

41    }

42
43    class Program
44    {
45        static void Main(string[] args)
46        {
47            Console.WriteLine(EnglishType.Car);
48
49            Console.WriteLine(ChineseType.汽车);
50
51            Console.WriteLine(中文.公交车);
52
53            中文类 中文对象 = new 中文类();
54            中文对象.输出结果();
55        }

56    }

57}

58

看这里面遍地的中文(还有繁体中文和日文),这些可不是伪代码噢,而是确确实实可行的代码!
Console Application complite by VS2005
Car
汽车
公交车
可以使用中文作为变量名:中文数值=20
可以使用繁體中文作为变量名:繁體中文数值=30
可以使用日文作为变量名:ショッピング=从日本雅虎拷的一段日文
可以使用中文作为类名和方法名!
请按任意键继续. . .
反正我以前是不太相信这种做法的,至少我会告诉人家,变量名必须是下划线或者字母开头的,但是事实征服了我,真的有点孤陋寡闻了。(所以凡事还是得试一下才能信之)
原因呢?
找了下应该是这样的,“标识符规则完全符合 Unicode 标准附件 15 推荐的规则”(C#1.2语言规范)(可以在VS安装目录下(类似)D:\Program Files\Microsoft Visual Studio 8\VC#\Specifications\2052文件夹下可以找到)。事实上不论变量名为如何,只要它的首字母不是数字或者含有标点字符的话(如果不确定是否可以的话,可以将其输入后即可了解它是否可行)或者不是关键字的话,它将都以它所表示的Unicode编码方式被编译进IL代码,这样的标志符就是合格的,中文或者日文的标志符符合以上特点,因此它是可以被支持的。这里的Unicode代码不代表文件本身是Unicode代码编码的(记事本另存为“Unicode”),用记事本另存您的文件为ANSI同样可以得到相同的效果。
我个人倒是不推荐以上的代码的,但是倒是可以小心地将其使用地“有意义”,中文切换估计让很多人觉得麻烦,但是面对业务逻辑命名的问题,似乎大家又难掩英语不地道的劣势,类似枚举这样的类型,我认为在命名难以规范的时候,我们倒是可以尝试用我们博大精深的中文来表示。其他情况,我们还是酌情使用吧。
在C++Primer这本非常经典的书的Page40页中也找到了相应的说法:变量名必须以字母或下划线开头,但是这本书针对的是ISO的C++,我写了如下代码在VS2005(VC++8.0下用Console方式编译(等价于用cl来命令行编译了))居然也编译通过了,不过由于VS2005是支持托管代码的,也就是说也有可能是在.net framework的支持下的。因此关于ISO-C++方面的问题我们还是按原来的认识,但是C++/CLI的部分您就自由发挥了吧。
 1// CPlus版.cpp : 定义控制台应用程序的入口点。
 2//
 3
 4#include "stdafx.h"
 5#include "iostream"
 6
 7class Normal
 8{
 9public:
10    static void Output()
11    {
12        std::cout<<"Normal version"<<std::endl;
13    }

14}
;
15class 中文
16{
17public:
18    static void 输出()
19    {
20        std::cout<<"中文版"<<std::endl;
21    }

22}
;
23int _tmain(int argc, _TCHAR* argv[])
24{
25    Normal::Output();
26    中文::输出();
27    return 0;
28}

29
30

文章最后还是建议您少用这样的代码,呵呵,最简单的原因估计你自己都受不了,那就是频繁在输入法之间的切换,当然更深层的原因可能是不可意料的~

供您参考:
C#1.2语言规范中关于标志符的描述(微软推荐):

posted on 2007-07-31 22:16  volnet(可以叫我大V)  阅读(1979)  评论(7编辑  收藏  举报

使用Live Messenger联系我
关闭