共通型システムと共通言語仕様Common Type System & Common Language Specification

これらの 2 つの用語は、.NET の世界で自由に使用されます。これらは実際には、.NET 実装で多言語開発を可能にし、そのしくみを理解するために重要です。Again, two terms that are freely used in the .NET world, they actually are crucial to understand how a .NET implementation enables multi-language development and to understand how it works.

共通型システムCommon Type System

最初に、.NET 実装は_言語に依存しない_点に注意してください。To start from the beginning, remember that a .NET implementation is language agnostic. これはプログラマーが IL にコンパイルできる任意の言語でコードを記述できることを意味するだけではありません。This doesn't just mean that a programmer can write their code in any language that can be compiled to IL. また、.NET 実装で使用可能な他の言語で記述されたコードをプログラマーが操作できる必要があることも意味します。It also means that they need to be able to interact with code written in other languages that are able to be used on a .NET implementation.

これを透過的に行うには、すべてのサポートされる種類を記述するための共通の方法が存在している必要があります。In order to do this transparently, there has to be a common way to describe all supported types. これは、共通型システム (CTS) の役割です。This is what the Common Type System (CTS) is in charge of doing. CTS には、次のようないくつかの目的があります。It was made to do several things:

  • 多言語での実行のためのフレームワークを確立する。Establish a framework for cross-language execution.
  • .NET 実装でさまざまな言語の実装をサポートするためのオブジェクト指向モデルを提供する。Provide an object-oriented model to support implementing various languages on a .NET implementation.
  • 型を扱うときにすべての言語が従う必要がある規則のセットを定義する。Define a set of rules that all languages must follow when it comes to working with types.
  • アプリケーション開発に使用される基本的なプリミティブ データ型 (BooleanByteChar など) を含んだライブラリを提供します。Provide a library that contains the basic primitive types that are used in application development (such as, Boolean, Byte, Char etc.)

CTS が定義する、参照型と値型という 2 つの主要な型をサポートする必要があります。CTS defines two main kinds of types that should be supported: reference and value types. それらの名前が空の定義を示します。Their names point to their definitions.

参照型のオブジェクトは、オブジェクトの実際の値を指す参照によって表されます。ここでの参照は、C/C++ のポインターに似ています。Reference types' objects are represented by a reference to the object's actual value; a reference here is similar to a pointer in C/C++. これは、単純にオブジェクトの値が存在しているメモリの場所を参照します。It simply refers to a memory location where the objects' values are. このことはこれらの型の使用方法に深く影響します。This has a profound impact on how these types are used. 変数に参照型割り当ててその変数をメソッドに渡す場合、たとえば、オブジェクトの変更はメイン オブジェクトに反映されます。コピーはありません。If you assign a reference type to a variable and then pass that variable into a method, for instance, any changes to the object will be reflected on the main object; there is no copying.

値型は、反対にオブジェクトがそれらの値によって表されます。Value types are the opposite, where the objects are represented by their values. 変数に値型を割り当てた場合、基本的にオブジェクトの値をコピーすることになります。If you assign a value type to a variable, you are essentially copying a value of the object.

CTS では、いくつかの型のカテゴリが定義され、それぞれに固有のセマンティックスと使用方法があります。CTS defines several categories of types, each with their specific semantics and usage:

  • クラスClasses
  • 構造体Structures
  • 列挙体Enums
  • インターフェイスInterfaces
  • デリゲートDelegates

CTS では、アクセス修飾子、有効な型のメンバー、継承とオーバーロードの動作など、型の他のすべてのプロパティも定義されます。CTS also defines all other properties of the types, such as access modifiers, what are valid type members, how inheritance and overloading works and so on. 残念ながら、これらのプロパティについての詳しい説明は概要の記事の範囲外ですが、これらのトピックの詳細情報については、最後の「その他のリソース」のリンクを参照してください。Unfortunately, going deep into any of those is beyond the scope of an introductory article such as this, but you can consult More resources section at the end for links to more in-depth content that covers these topics.

共通言語仕様Common Language Specification

完全な相互運用シナリオを有効にするには、コードで作成されるすべてのオブジェクトがそれらを使用している言語 (呼び出し元) で何らかの共通点に依存する必要があります。To enable full interoperability scenarios, all objects that are created in code must rely on some commonality in the languages that are consuming them (are their callers). 多くの異なる言語があるので、.NET では、共通言語仕様 (CLS) という共通性を規定しています。Since there are numerous different languages, .NET has specified those commonalities in something called the Common Language Specification (CLS). CLS は、多くの一般的なアプリケーションに必要な機能のセットを定義しています。CLS defines a set of features that are needed by many common applications. さらに、サポートする必要がある .NET 上に実装される言語用のある種のレシピも提供しています。It also provides a sort of recipe for any language that is implemented on top of .NET on what it needs to support.

CLS は CTS のサブセットです。CLS is a subset of the CTS. つまり、CLS により厳しい規則がない限り、CTS のすべての規則は CLS にも適用されます。This means that all of the rules in the CTS also apply to the CLS, unless the CLS rules are more strict. CLS の規則のみを使用してコンポーネントがビルドされている場合、つまり API で CLS の機能のみが公開されている場合、CLS 準拠であると言われます。If a component is built using only the rules in the CLS, that is, it exposes only the CLS features in its API, it is said to be CLS-compliant. たとえば、<framework-librares> は、.NET がサポートされているすべての言語で機能する必要があるため、まさに CLS 準拠です。For instance, the <framework-librares> are CLS-compliant precisely because they need to work across all of the languages that are supported on .NET.

CMS のすべての機能の概要については、下の「その他のリソース」セクションのドキュメントを参照してください。You can consult the documents in the More Resources section below to get an overview of all the features in the CLS.

その他のリソースMore resources