2

C#言語コンパイラは、特定の構文のテキストを理解し、コンパイルされたコードを生成できる自己完結型のブラックボックスだと思います。一方、.NET Frameworkは、一部がC#で、一部がC++で記述された機能を含む大規模なライブラリです。したがって、.NET FrameworkはC#言語に依存しており、その逆ではありません。

しかし、これをLINQの動作に適合させることはできません。LINQクエリは、C#コンパイラが理解できる特定の構文のテキストです。ただし、独自のLINQプロバイダーでビルドするには、フレームワークのSystem.Linq名前空間で定義されているIQueryableやIQueryProviderなどのインターフェイスを使用する必要があります。

これは、C#言語が提供する機能が.NET Frameworkの一部に依存していることを意味しますか?C#言語は.NET Frameworkについて知っていますか?

4

2 に答える 2

8

.NET Frameworkには、多くの要素が含まれています。最も重要なものの1つは、CLR —共通言語ランタイムです。すべての.NET言語は、マシンプロセッサで実行できないILコードを生成するため、C#を含めてこれに依存しています。代わりに、CLRがそれを実行します。

また、すべての.NET言語で使用できる基本クラスライブラリBCLもあります。C#、VB.NET、マネージC ++、F#、IronRubyなどです。C#で書かれたとは思えません。クラスとOOPはCLRに組み込まれているため、これらの言語の機能には依存しません。

したがって、はい、C#言語は.NET Frameworkについて知っています、それは絶対にそれについて知っている必要があります。について考えてみてくださいIEnumerable。コンパイルforeachGetEnumerator()MoveNext()呼び出すには、C#コンパイラはそれが存在することを認識している必要がありIEnumerableます。そして、やや特別です。

または属性について考えてください!AttributeC#コンパイラには、インターフェイスが提供するメソッドに関する本質的な知識があります。

しかし、CLR自体はC#について何も知りません。まったく。

于 2012-12-26T10:39:09.753 に答える
7

LINQクエリは、C#コンパイラが理解できる特定の構文のテキストです。

ええと、クエリ式は-ですが、コンパイラは実際にはそれらを「理解」していません。それはかなり機械的な方法でそれらを翻訳するだけです。たとえば、次のクエリを実行します。

var query = from foo in bar
            where foo.X > 10
            select foo.Y;

これは次のように翻訳されます。

var query = bar.Where(foo => foo.X > 10)
               .Select(foo => foo.Y);

コンパイラは、ここで何を意味するのかについて何知りません。それらはメソッドである必要はありません。デリゲート型の適切なフィールドまたはプロパティがあれば、コンパイラーはそれで問題ありません。基本的に、2番目の形式がコンパイルされる場合、クエリ式もコンパイルされます。WhereSelect

ほとんどのLINQプロバイダーは、拡張メソッドを使用してこれらのメソッド(Where、、など)Selectを提供しますSelectMany。繰り返しになりますが、これらはC#言語の一部にすぎません。コンパイラは、拡張メソッドが何をするのかを知らないか、気にしませ

クエリ式の変換方法の詳細については、Edulinqブログシリーズのパート41を参照してください。私のEdulinqシリーズの残りの部分も有益であることがわかるかもしれません-それは基本的に、一度に1つのメソッドでLINQtoObjectsを再実装する一連のブログ投稿です。System.Linq繰り返しになりますが、これは、C#コンパイラが名前空間にあるLINQ実装などに依存していないことを示しています。

于 2012-12-26T10:38:50.887 に答える