71

C# が多くの並列プログラミングをサポートしていることは知っていますが、私の知る限り、副作用を検証するための構成要素はまだありませんよね?

C# が既にレイアウトされている今では、よりトリッキーだと思います。しかし、これを入れる予定はありますか?それとも、F# は、副作用検証のための構造を持つ唯一の .NET 言語ですか?

4

3 に答える 3

173

C# 言語はそうではありませんが、.NET フレームワークはそうかもしれません。

コントラクト ライブラリ + .NET 4 で導入された静的分析ツールは、これらを導入する可能性があります。

Microsoft は現在、.NET 3.5 フレームワーク内で [Immutable] と [Pure] を使用しています。

たとえば、System.Core.dll の .NET 3.5 内の [Microsoft.Contracts.Immutable] と [Microsoft.Contracts.Pure] を参照してください。残念ながら、それらは内部的なものです。ただし、Microsoft.Contracts.* は主に Spec# の研究から生まれており、Spec# は .NET 4.0 の一部となる Contracts API に組み込まれています。

これから何が起こるか見てみましょう。プレリリースの .NET 4.0 ビットに [Pure] や [Immutable] などの API がコントラクト API に含まれているかどうかは確認していません。もしそうなら、コンパイラではなく、静的分析ツールがルールを適用するツールになると思います。

編集今週、MS Code Contracts の最新のプレリリース ドロップから Microsoft.Contracts.dll をロードしました。朗報: [Pure] および [Mutability(Mutability.Immutable)] 属性がライブラリに存在します。これは、.NET 4.0 に含まれることを示唆しています。ウーフー!

edit 2 .NET 4 がリリースされたので、これらの型を調べました。[Pure]はまだ System.Diagnostics.Contracts 名前空間にあります。これは一般的な使用を意図したものではなく、Contract API の事前および事後条件チェックでの使用を目的としています。これはコンパイラによって強制されるものではなく、コード コントラクト チェッカー ツールによって純度が強制されるものでもありません。【可変性】がなくなりました。興味深いことに、Microsoft は .NET 3.5 (System.Core.dll の内部 BigInteger クラス) で Mutability および Pure 属性を使用していましたが、.NET 4 では BigInteger を System.Numerics に移動し、[Pure] と [Mutability] を取り除きました。そのタイプの属性。結論: .NET 4 は、副作用の検証については何もしていないようです。

編集 3最近 (2011 年後半) プレビューされた Microsoft Rosyln サービスとしてのコンパイラ ツール (Visual Studio 2015 で RTM に予定されていると考えられています) では、このようなものをサポートできるように見えます。純粋性と不変性をチェックするためにコンパイラに拡張機能を記述し、それらの属性で装飾されたものが規則に従っていない場合はコンパイラの警告を発行することができます。それでも、これをサポートするために数年かかると考えています。

edit 4 2015 年の夏の時点で Rosyln がここにあるため、純粋/不変性のためのコンパイラ拡張機能を構築する機能が実際に存在します。ただし、それは既存のフレームワーク コードやサード パーティのライブラリ コードに対しては何もしません。しかし、不変型に対する C# 7 の提案が間近に迫っています。これはコンパイラによって強制され、C# に新しいimmutableキーワードが導入され、.NET フレームワークに [Immutable] 属性が導入されます。使用法:

// Edit #4: This is a proposed design for C# 7 immutable as of June 2015.
// Compiler will implicitly mark all fields as readonly.
// Compiler will enforce all fields must be immutable types.
public immutable class Person
{
    public Person(string firstName, string lastName, DateTimeOffset birthDay)
    {
        FirstName = firstName; // Properties can be assigned only in the constructor.
        LastName = lastName;
        BirthDay = birthDay; 
    }

    public string FirstName { get; } // String is [Immutable], so OK to have as a readonly property
    public string LastName { get; }
    public DateTime BirthDay { get; } // Date is [Immutable] too.
}

edit 5 2016 年 11 月で、C# 7 から不変型が削除されたようです。C# 8 には常に希望があります。:-)

編集 6 2017 年 11 月です。C# 8 が完全に表示されます。純粋な関数はありませんが、readonly structsがあります。これにより、構造体が不変になり、いくつかのコンパイラの最適化が可能になります。

編集 7 2020 年 7 月になり、C# 9では、完全に不変の型であるrecordsがサポートされます。さらに、レコードには、With新しい状態を表すために既存のレコードから新しいレコードを作成するための式があります。

edit 8 2021 年 11 月になり、C# 10 がリリースされ、構造体だけでなく構造体のWith式もサポートされましrecordた。これらは、不変型の作成にも役立ちます。

于 2009-02-26T23:41:33.523 に答える
17

副作用を検証するものがないだけでなく、型が不変であることを検証するものさえありません。これは、同じルート IMO に沿った小さなステップです。

私は、C# 4.0 で何かがパイプから出てくるとは思っていません (ただし、私は簡単に間違っている可能性があります)。不変性が C# 5.0 に影響を与えることを心から願っています。確かに、Eric Lippert はそれについてかなりの量のブログを書いており、MS の人々は並列処理についてかなりの量を考えてきました。

励みになる画像でなくてすみません。

編集:ユダの答えはかなり明るいです...フレームワークのサポートはあなたにとって十分でしょうか?:) (Code Contracts のいくつかの側面が .NET 4.0 に対応できていなくても、まったく驚かないでしょう。念のために言っておきますが、最初のリリースを比較的小さくして、後でブーストしたのかもしれません。)

于 2009-02-26T23:33:54.820 に答える