4

好吧,我发现这对我来说非常奇怪,但是在 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 학생("빵상아줌마", "빵빵 똥똥똥똥 땅땅 따라라라라~~~"));

            스쿨오브헬.재학생출력();
        }
    }
}

上面的代码编译并给你一个有效的输出。

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

我的问题如下:

  • 这是 C# 功能还是 Visual Studio 功能?(我无法在 Visual Studio 2010 下的 C++ 中获得类似的程序)
  • 对性能有什么影响?(我很容易假设几乎没有,但不确定他们是否进行了任何疯狂的转换以允许非 ASCII 字符进行编码)
  • 实现此功能的原因是什么?
4

2 回答 2

5

1:它在C#语言规范中,所以:C#

2:没有;解析器并不真正关心某事是否是Fredvs 프로그램;对编译器都不重要

3:因为并非所有开发人员都将英语(或:拉丁语)作为他们的主要语言。프로그램对于从事该项目的开发人员来说,这很可能非常容易且有意义地表达了课程的意图

于 2012-10-01T11:52:52.697 回答
3

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

C# 标准说

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

符合标准的程序中的标识符必须采用 Unicode 规范化表格 C 定义的规范格式,如 Unicode 标准附件 15 所定义。遇到不在规范化表格 C 中的标识符时的行为是实现定义的;但是,不需要诊断。

ECMA CLI 标准有这样的说法:

I.8.5 命名

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

I.8.5.1 有效名称

所有名称比较都是逐字节进行的(即区分大小写、与区域无关,也称为代码点比较)。在名称用于访问内置 VES 提供的功能(例如,类初始化方法)的地方,总是在定义上附带一个指示,以免内置任何保留名称集。

重要段落如下:

CLS 规则 4:程序集应遵循 Unicode 标准 3.0 技术报告 15 的附件 7,管理允许开始和包含在标识符中的字符集,可在http://www.unicode.org/unicode/reports/tr15在线获取/tr15-18.html 标识符应采用 Unicode 规范化表格 C 定义的规范格式。对于 CLS 目的,如果两个标识符的小写映射(由 Unicode 区域设置不敏感、一对一的小写映射指定)则它们是相同的) 是相同的。也就是说,对于在 CLS 下被视为不同的两个标识符,它们的区别不仅仅在于它们的情况。但是,为了覆盖继承的定义,CLI 需要使用原始声明的精确编码。

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

2)不应该有任何性能影响。CLI 规则规定必须使用不区分 Unicode 区域设置的映射来完成名称匹配,这意味着当需要比较两个名称时,必须转换为一系列 Unicode 代码点。如果编译器或运行时选择将此信息保存在 UTF-8 等可变长度编码中并即时转换为代码点,那么理论上会有一些性能差异;实际上,我不希望任何实现可以做到这一点,或者如果他们做到了,性能差异是可以衡量的。

请注意,CLS 规则 4 说“为了覆盖继承的定义,CLI 需要使用原始声明的精确编码”,这在覆盖名称时确实设置了特定限制。但是由于这不是一个普遍的要求,所以无论如何都必须实现“在比较之前将所有内容转换为代码点”。

3) 同样,它在 CLI 规范中,所以语言必须这样做。

于 2012-10-01T11:57:54.033 回答