C# 非ASCII语言编码

C# 非ASCII语言编码,c#,.net,unicode,C#,.net,Unicode,好吧,我觉得这很奇怪,但是在C中,你可以用另一种语言编写你的源代码。我已经用韩语编写了一个示例源代码来说明我的观点: namespace 대한민국 { public class 학생 { public string 이름 { get; private set; } public string 좌우명 { get; private set; } public 학생(string 이름, string 좌우명) { t

好吧,我觉得这很奇怪,但是在C中,你可以用另一种语言编写你的源代码。我已经用韩语编写了一个示例源代码来说明我的观点:

namespace 대한민국 {
    public class 학생 {
        public string 이름 { get; private set; }
        public string 좌우명 { get; private set; }

        public 학생(string 이름, string 좌우명) {
            this.이름 = 이름;
            this.좌우명 = 좌우명;
        }
    }
    public class 대학교 {
        private List<학생> 재학생목록 = new List<학생>();

        public void 입학(학생 입학생) {
            재학생목록.Add(입학생);
        }

        public void 재학생출력() {
            foreach (학생 선택된학생 in 재학생목록) {
                Console.WriteLine("이름: {0}", 선택된학생.이름);
                Console.WriteLine("좌우명: {0}", 선택된학생.좌우명);
            }
        }
    }
    public class 프로그램 {
        static void Main(string[] args) {
            대학교 스쿨오브헬 = new 대학교();
            스쿨오브헬.입학(new 학생("전땅끄", "본인은 단돈 29만원과 땅끄로 이 신성하고 거룩한 국가의 민주주의를 발전시켰소"));
            스쿨오브헬.입학(new 학생("이피카츄", "여러분 이거 다 거짓말인거 아시죠!!!"));
            스쿨오브헬.입학(new 학생("빵상아줌마", "빵빵 똥똥똥똥 땅땅 따라라라라~~~"));

            스쿨오브헬.재학생출력();
        }
    }
}
名称空间대한민국 {
公共课학생 {
公共字符串이름 {get;私有集;}
公共字符串좌우명 {get;私有集;}
公开的학생(弦이름, 一串좌우명) {
这이름 = 이름;
这좌우명 = 좌우명;
}
}
公共课대학교 {
私人名单재학생목록 = 新列表();
公共空间입학(학생 입학생) {
재학생목록.加(입학생);
}
公共空间재학생출력() {
弗雷奇(학생 선택된학생 在里面재학생목록) {
控制台写入线(“이름: {0}", 선택된학생.이름);
控制台写入线(“좌우명: {0}", 선택된학생.좌우명);
}
}
}
公共课프로그램 {
静态void Main(字符串[]参数){
대학교 스쿨오브헬 = 新的대학교();
스쿨오브헬.입학(新的학생("전땅끄", "본인은 단돈 29만원과 땅끄로 이 신성하고 거룩한 국가의 민주주의를 발전시켰소"));
스쿨오브헬.입학(新的학생("이피카츄", "여러분 이거 다 거짓말인거 아시죠!!!"));
스쿨오브헬.입학(新的학생("빵상아줌마", "빵빵 똥똥똥똥 땅땅 따라라라라~~~"));
스쿨오브헬.재학생출력();
}
}
}
上面的代码编译并提供有效的输出

除了关键字,你实际上可以用英语以外的语言编写你的源代码。当然,这是非常不切实际的,没有人会这么做

我的问题如下:

  • 这是C语言特性还是VisualStudio的特性?(我不能在Visual Studio 2010下获得类似于C++的程序)
  • 性能影响是什么?(我很容易假设几乎没有,但不确定他们是否进行了疯狂的转换,允许非ASCII字符进行编码)
  • 实施此功能的原因是什么
1:它在C语言规范中,所以:C#

2:一点也不;解析器并不真正关心某个东西是否是
Fred
vs
프로그램;两者对编译器都不重要

3:因为不是所有开发人员都以英语(或:拉丁语)为主要语言。很可能是
프로그램
对于从事该项目的开发人员来说非常容易且有意义地表达了类的意图

1)C#规范和CLI规范都允许这样做

C#standard说

源文件是Unicode字符的有序序列

一致性程序中的标识符必须采用规范格式 由Unicode规范化形式C定义,如Unicode所定义 标准附录15.遇到不在列表中的标识符时的行为 规范化表单C是实现定义的;但是,诊断 不需要

ECMA CLI标准规定:

I.8.5命名 为类型系统的实体指定名称,以便其他实体可以引用它们 类型系统的一部分,或通过类型的实现。类型、字段、方法, 属性和事件都有名称。对于类型系统、值、局部变量和 参数没有名称。系统类型的实体只有一个名称(例如。, 一个类型只有一个名称)

I.8.5.1有效名称 所有名称的比较都是逐字节进行的(即区分大小写、区域设置)- 独立,也称为代码点比较)基础。其中名称用于访问 内置VES提供的功能(例如,类初始化方法)有 始终在定义上附带指示,以免在任何一组 保留名称

重要段落如下:

CLS第4条:组件应遵循Unicode技术报告15的附件7 标准3.0管理允许开始的字符集,并包括在 标识符,可在线访问 标识符应采用Unicode规范化格式C定义的规范格式。 出于CLS目的,如果两个标识符的小写映射(如指定)相同,则它们是相同的 对于Unicode区域设置不敏感,一对一的小写映射)是相同的, 对于CLS下被视为不同的两个标识符,它们应在更多方面有所不同 但是,为了覆盖继承的定义,CLI 要求使用原始声明的精确编码

[注: CLS(使用者):不需要使用违反CLS规则4的类型,但应具有 允许访问使用自己的关键字之一作为名称的命名项的机制。 CLS(扩展程序):不需要创建违反CLS规则4的类型。应提供一种机制 用于定义符合这些规则但与中的关键字相同的新名称 语言。 CLS(框架):不应导出违反CLS规则4的类型。应避免使用 在编程语言中常用作关键字的名称

(二)不会对性能产生任何影响。CLI规则规定,名称匹配必须使用Unicode不区分区域设置的映射来完成,这意味着当需要比较两个名称时,必须转换为Unicode代码点序列。如果编译器或运行时选择保留此信息,则在可变长度编码(如UTF-8)中使用,并动态转换为代码点,理论上会有一些性能差异;实际上,我不希望有任何实现