問題タブ [immutable-collections]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - API 間で不変コレクションを渡すための最適なパターンは何ですか?
不変になる前は、多くの API でIEnumerableが頼りになるインターフェイスでした。これには、API が渡されたオブジェクトの実際の型に影響されないという利点があったためです。
もちろん、これには少なくとも 2 つの欠点があります。
API の背後にあるコードは、 collectionOfThingsの不変性に依存できず、「コレクションが変更されました」例外が発生したり、その他の微妙な問題が発生したりする可能性があります。
collectionOfThingsが実際のコレクションなのか、単に遅延クエリなのかはわかりません。それが実際のコレクションであると想定し、そうでない場合、複数の列挙を実行することでパフォーマンスが低下するリスクがあります。それが遅延クエリであり、実際には実際のコレクションであると仮定した場合、それをローカル リストまたは他の凍結されたコレクションに変換すると、最初の問題から保護するのに役立ちますが、不必要なコストが発生します (「ToList」操作の実行中に競合状態が依然として発生します)。 )。明らかに、これをチェックして「正しいこと」を実行するために少量のコードを作成することはできますが、これは面倒な余分な混乱です。
命名規則を使用する以外に、これに対処するための満足のいくパターンを見つけたことがないことを認めなければなりません。実用的なアプローチは、 IEnumerableがコレクションを渡すための最も摩擦の少ないアプローチであると思われましたが、欠点はありました。
現在、不変のコレクションにより、状況は大幅に改善されています...
コレクションが変更されるリスクがなくなり、複数の列挙によるパフォーマンスへの影響についてあいまいさがなくなりました。
ただし、ImmutableListを渡す必要があるため、明らかに API の柔軟性が失われています。私たちのクライアントが他の種類の列挙可能な不変コレクションを持っている場合、それを列挙することだけが目的であっても、それを消費するにはImmutableListにコピーする必要があります。
理想的には、次のようなインターフェースを使用できます
しかしもちろん、インターフェイスは、慣習による場合を除いて、不変性などのセマンティクスを強制することはできません。
基本クラスを使用するとうまくいくかもしれません
ただし、サブクラスが可変性を導入しないように、封印されていない不変クラスを作成することは悪い形式と見なされます。いずれにせよ、これは BCL では行われていません。
または、API で IEnumerable を使用し続け、命名規則を使用して、コードが渡される不変のコレクションに依存していることを明確にすることもできます。
だから...私の質問は、不変のコレクションを渡すときにどのパターンが最適と考えられるかということです? ImmutableListは、不変性を使い始めたら「新しいIEnumerable 」ですか、それとももっと良い方法がありますか?
アップデート
IReadOnlyCollection (以下の Yuval Itzchakov によって提案されています) はIEnumerableよりも明らかに改善されていますが、コレクション内の制御されていない変更からコンシューマーを完全に保護することはできません。Roslyn コードベースが (主にImmutableArrayを介して) 不変性を多用し、これらを他のメソッドに渡すときに明示的な型指定を使用しているように見えることは注目に値しますが、 ImmutableListがIEnumerableを受け入れるメソッドに渡される場所がいくつかあります。
c# - ImmutableHashSet .Contains は false を返します
ベースアイテムのリスト(正確ImmutableHashSet<ListItem>
には System.Collections.Immutable から)があり、次のコードを呼び出そうとします
しかし、これはfalseを返します。
次のコード行はすべてtrueを返しますが、
次のように書くこともできますが、true が返されます。
私は何を間違っていますか.OfTypeのものを書くことは避けたいです。
編集:
編集2:
ImmutableHashSet<>
ここで私の問題の再現可能なコードは、キャッシュのように見えGetHashCode
、現在とリスト内のエントリを比較しません。アイテムの数が異なる可能性があることをGetHashCode
伝える方法はありますか?そのいまいましい同じ参照...ImmutableHashSet<>
GetHashCode
ImmutableHashSet<>
をコードに変更するとImmutableList<>
問題なく動作するので、皆さんが良いアイデアを思いつかない場合は、リストに切り替えます。
java - JAVA: リストとしての ImmutableSet
現在、関数呼び出し (getFeatures()) から ImmutableSet が返されていますが、後で実行される残りのコードの構造により、これをリストに変更する方がはるかに簡単です。ランタイム例外を生成するキャストを試みました。また、それをリストに変換するための関数呼び出しを調べましたが、役に立ちませんでした。これを行う方法はありますか?私の最近の [失敗した] 試行を以下に示します。
ImmutableList を提供する wrapperSet.asList() を見つけましたが、可変リストの方がはるかに好きです
c# - ReadonlyCollection、オブジェクトは不変ですか?
ReadOnlyCollection を使用してオブジェクトを不変にしようとしています。オブジェクトのプロパティを不変にしたいのです。
しかし、私は少し混乱しました。
foreach を使用してオブジェクトのプロパティを MyReadOnlyList に変更しようとしましたが、値のプロパティを変更できますが、正しいですか? ReadOnlyCollection が追加レベルを設定して、オブジェクトを不変にすることを理解しました。
c# - C# 多次元不変配列
シンプルなゲーム用のフィールドを作成する必要があります。最初のバージョンでは、フィールドは Point[,]
2 次元配列のようでした。
今、私は System.Collections.Immutable を使用する必要があります(これは重要な条件です)。私はグーグルで検索しようとしていますが、何かを見つけることができません。2 次元の ImmutableArray (または ImmutableList) を作成する方法がわかりません。
java - Java Guava と Scala の不変リストの連結の違い
私は Java で Spark を試していますが、Java の不変コレクションに行き詰まります。
Scala で 2 つの不変リストを組み合わせると、ディープ コピーは発生しません。ただし、グアバのように Java で使用可能な不変リストは、防御的なコピーを行います。(間違っていたら訂正してください)
簡単に私の質問は次のとおりです。
- scala immutable list と同じ動作をする Java 不変リストはありますか?
- 最初の質問の答えが NO の場合、Java コードで scala 不変コレクションを使用する一般的な (標準的な) 方法は何ですか?
どうもありがとう。
c# - System.Collections.System.Runtime および FxCop/metrics への不変参照
Windows 7
インストールしたら、.NET 4.5.2.NET 4.5.2
を対象とする新しい ClassLibrary プロジェクトを作成します。
にある Visual Studio 2013 にmetrics.exe
同梱されている を起動して、そのアセンブリのコード メトリックを計算したいと考えています。FxCop
c:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools\FxCop\
すべて正常に動作します。
私はそれから nuget System.Collections.Immutable v1.1.37
。
System.Collections.Immutable のみが参照されていることを参照で確認できます。他の依存関係 ( System.Runtime
、System.Collections
などSystem.Diagnotics.Debug
) が見つかったためです ( にあると思いますc:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\Facades\
) 。
ダミーの ImmutableArray を作成するダミーのメソッドを作成しますvar foo = new List<int>().ToImmutableArray();
すべてがコンパイルされ、正常に動作します。
メトリクスの計算を再開します。
次のエラーがあります。
metrics.exe /f:c:\dev\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll /o:toto.xml
エラー: CA0055: ファイルを読み込めませんでした: 'c:\dev\ClassLibrary1\ClassLibrary1\bin\Debug\ClassLibrary1.dll'.
アセンブリで同じコマンドを実行するとSystem.Immutable.Collections
、次のエラーが発生します。
ファイル 'c:\dev\ClassLibrary1\ClassLibrary1\bin\Debug\System.Collections.Immutable.dll' のメトリックを計算しています。フレームワーク アセンブリ 'System.Runtime、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a' が見つかりませんでした。
System.Runtime
ここで、出力ディレクトリにあるファイルをコピーするとc:\Windows\Microsoft.NET\Framework\v4.0.30319\
、コード メトリックの計算が正常にClassLibrary1.dll
機能します。しかし、にあるバージョンをコピーすると、c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\Facades\
再び失敗します。
Web アプリケーションで Immutable を使用して別のライブラリをデバッグすると、「読み込まれたモジュール」に次のように表示されます。
System.Runtime.dll C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Runtime\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.dll はい いいえ シンボルの読み込みをスキップしました。544 4.06.1055.0 06/11/2015 03:49 000007FED10D0000-000007FED10D9000 [15760] w3wp.exe [4] /LM/W3SVC/2/ROOT/WebSite-2-131026947404276669
これらすべてから、 System.Collections.Immutable は System.Runtime のバージョンを使用していると思いますc:\Windows\Microsoft.NET\Framework\v4.0.30319\
そこで、「そのアセンブリへの明示的な参照を追加しよう」と考えました。もしそうなら、私は次のコンパイルエラーを受け取りました:
エラー CS1703: 同等の ID を持つ複数のアセンブリがインポートされました: 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.dll' および 'C:\Program Files (x86)\Reference Assemblies\Microsoft\ Framework.NETFramework\v4.5.2\Facades\System.Runtime.dll'. 重複する参照の 1 つを削除します。
どこかが間違っていて、それを特定することはできません。
/ignoreinvalidtargets
forを使用してエラーを回避しましたmetrics.exe
。
本当のエラーについてクラブを持っている人はいますか?
(また、.NET Framework 4 をターゲットにしてc:\Windows\Microsoft.NET\Framework\v4.0.30319\
、CopyLocal = true を使用してすべての依存アセンブリへの参照を追加しようとしました。次の警告にもかかわらず、機能します。
一部の NuGet パッケージは、現在のターゲット フレームワークとは異なるターゲット フレームワークを使用してインストールされており、再インストールが必要になる場合があります。詳細については、 http://docs.nuget.org/docs/workflows/reinstalling-packagesにアクセスしてください。影響を受けるパッケージ: System.Collections、System.Collections.Immutable、System.Diagnostics.Debug、System.Globalization、System.Linq、System.Resources.ResourceManager、System.Runtime、System.Runtime.Extensions、System.Threading
)
ありがとう。