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: 何もありません。Fredパーサーは、何かがvsであるかどうかをあまり気にしません프로그램。どちらもコンパイラにとって重要ではありません

3: すべての開発者が第一言語として英語 (または: ラテン語) を話すわけではないためです。프로그램そのプロジェクトに取り組んでいる開発者にとって、クラスの意図を非常に簡単かつ有意義に表現することは、おそらく可能です。

于 2012-10-01T11:52:52.697 に答える
3

1) C# 仕様と CLI 仕様の両方でこれが許可されています。

C# 標準では、

ソース ファイルは、順序付けられた一連の Unicode 文字です。

適合プログラムの識別子は、Unicode Standard Annex 15 で定義されているように、Unicode 正規化フォーム C で定義された標準形式でなければなりません。正規化フォーム C にない識別子に遭遇したときの動作は実装定義です。ただし、診断は必要ありません。

ECMA CLI 標準には、次のように書かれています。

I.8.5 ネーミング

型システムの他の部分または型の実装によって参照できるように、型システムのエンティティに名前が付けられます。型、フィールド、メソッド、プロパティ、およびイベントには名前があります。型システムに関しては、値、ローカル、およびパラメーターには名前がありません。型システムのエンティティには、1 つの名前が付けられます (たとえば、型には 1 つの名前しかありません)。

I.8.5.1 有効な名前

すべての名前の比較は、バイト単位で行われます (つまり、大文字と小文字を区別し、ロケールに依存しない、コード ポイント比較とも呼ばれます)。組み込みの VES 提供機能 (クラス初期化メソッドなど) にアクセスするために名前が使用される場合、予約済みの名前のセットを組み込まないように、常に定義に付随する指示があります。

重要な箇所は次のとおりです。

CLS ルール 4:アセンブリは、Unicode 標準 3.0 のテクニカル レポート 15 の付属書 7 に従うものとします。これは、開始および識別子に含めることが許可されている文字のセットを規定しています。 /tr15-18.html 識別子は、Unicode 正規化フォーム C で定義された標準形式でなければなりません。CLS の目的では、2 つの識別子は、小文字のマッピング (Unicode ロケールに依存しない、1 対 1 の小文字のマッピングで指定されているように) の場合、同じです。 ) 同じだ。つまり、CLS の下で異なると見なされる 2 つの識別子は、単に大文字と小文字が異なるだけではありません。ただし、継承された定義をオーバーライドするために、CLI では元の宣言の正確なエンコードを使用する必要があります。

[注: CLS (消費者): CLS ルール 4 に違反する型を消費する必要はありませんが、独自のキーワードの 1 つを名前として使用する名前付きアイテムへのアクセスを許可するメカニズムが必要です。CLS (エクステンダー): CLS 規則 4 に違反する型を作成する必要はありません。これらの規則に従うが、言語のキーワードと同じである新しい名前を定義するためのメカニズムを提供する必要があります。CLS (フレームワーク): CLS ルール 4 に違反する型をエクスポートしないでください。プログラミング言語でキーワードとして一般的に使用される名前の使用を避ける必要があります。

2) パフォーマンスへの影響はまったくありません。CLI ルールでは、名前の照合は Unicode ロケールに依存しないマッピングを使用して行う必要があると規定されています。つまり、2 つの名前を比較する必要がある場合は、一連の Unicode コード ポイントに変換する必要があります。コンパイラまたはランタイムがこの情報を UTF-8 などの可変長エンコーディングで保持し、オンザフライでコード ポイントに変換することを選択した場合、理論的にはパフォーマンスに多少の違いがあります実際には、実装がこれを行うとは思わないか、そうしたとしてもパフォーマンスの違いが測定可能になるとは思いません。

CLS ルール 4 は、「継承された定義をオーバーライドするために、CLI は元の宣言の正確なエンコードを使用する必要がある」と述べていることに注意してください。これは、名前をオーバーライドするときに特定の制限を課します。ただし、これは普遍的な要件ではないため、「比較する前にすべてをコード ポイントに変換する」を実装する必要があります。

3) 繰り返しますが、これは CLI 仕様にあるため、言語で行う必要があります。

于 2012-10-01T11:57:54.033 に答える