問題タブ [readonly-collection]
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# - Listの読み取り専用ラッパーを返す方法望ましいですか?
たとえば、プライベートリストを持つジェネリッククラスがあります。少なくとも2つの方法で、このリストの読み取り専用ラッパーを返すようにすることができます。
両方とも、基になるコレクションの変更Values1
をValues2
反映し、それ自体が変更されるのを防ぎます。
どちらが望ましいですか?何に注意する必要がありますか?それとも他にもっと良い方法はありますか?
c# - FluentNhibernate を使用してコレクションを読み取り専用でないように構成するにはどうすればよいですか?
ここで考えられることはすべて試しましたが、行き詰まっています。多くUser
の がありますが、を呼び出してのフィールドにInvitations
を追加しようとすると、. マッピングのオーバーライドに何かあるような気がしますが、同じパターンに従って他のさまざまなクラス/関係があり、(これまでのところ)この問題は他の場所では発生していません。バッキング フィールドが読み取り専用である理由と、バッキング フィールドが読み取り専用にならないようにするにはどうすればよいですか?Invitation
invitations
User
AddInvitation()
NotSupported
Collection is read-only
ユーザー.cs
招待.cs
データベース.cs
Manager.cs
実際の例外メッセージを取得しました (最初にこれを追加する必要がありました)
System.ThrowHelper.ThrowNotSupportedException (ExceptionResource リソース) で System.Collections.ObjectModel.ReadOnlyCollection'1.System.Collections.Generic.ICollection.Add(T 値) で NHibernate.Collection.Generic.PersistentGenericBag'1.System.Collections.Generic .ICollection.Add(T アイテム)
フィールドの招待状を変更しているにもかかわらず、アクセサー Invitations によって追加された ReadOnlyCollection ラッパーがフィールド自体を変更しているようです。
c# - ルックアップコレクションとアイテムを編集から保護します
これらのどれも編集可能にしたくありません。コレクションの場合、ReadOnlyCollectionを使用することは非常に明確に思えます(コレクションから常に新しいReadOnlyCollectionを作成するのに良い方法かどうかはわかりませんが(コストがかかりますか?))。
しかし、もっと重要なのは、コレクション内のアイテムをどうするかということです。このテストに合格したいのですが?
c# - ReadOnlyCollection vs Liskov - 可変コレクションの不変表現を正しくモデル化する方法
リスコフ置換の原則では、サブタイプがスーパータイプの契約を満たす必要があります。私の理解では、これはReadOnlyCollection<T>
リスコフに違反することを伴います。 ICollection<T>
のコントラクトはエクスポーズAdd
とRemove
操作を行いますが、読み取り専用サブタイプはこのコントラクトを満たしません。例えば、
不変のコレクションが必要であることは明らかです。それらをモデル化する .NET の方法に何か問題がありますか? それを行うためのより良い方法は何ですか? IEnumerable<T>
少なくとも不変に見える一方で、コレクションを公開するという良い仕事をします。ただし、セマンティクスは大きく異なります。これは主にIEnumerable
、状態を明示的に公開しないためです。
私の特定のケースでは、 FSMをサポートするために不変のDAGクラスを構築しようとしています。最初に/メソッドが明らかに必要ですが、すでに実行されている状態マシンを変更できるようにしたくありません。DAG の不変表現と可変表現の類似性を表現するのに苦労しています。AddNode
AddEdge
現在、私の設計では、前もって DAG Builder を使用してから、不変グラフを一度作成する必要があります。その時点で、それは編集できなくなります。Builder と具体的な不変 DAG の間の唯一の共通インターフェイスはAccept(IVisitor visitor)
. おそらくより単純なオプションに直面して、これが過度に設計されている/抽象的すぎる可能性があることを懸念しています。同時に、NotSupportedException
クライアントが特定の実装を取得した場合にスローされる可能性のあるメソッドをグラフ インターフェイスに公開できることを受け入れるのに苦労しています。これを処理する正しい方法は何ですか?
c# - HashSetとHashedSet(Iesi):奇妙な動作
今日、私は自分のドメインモデルでいくつかのことをテストしていましたが、その動作が期待したものではないことに気づきました。
Customers-Orders
単純なモデルを作成する際に問題を切り分けようとしました。
これが私のマッピングです。
お客様:
注文:
私Order
のクラスはとてもシンプルです:
これが私のCustomer
クラスです:
ICollection<Order>
この最初の例では、として作成されたプライベートを使用していHashSet<Order>
ます。
このコードを実行すると:
INSERT
顧客のとINSERT
注文の2つを見ることができますが、顧客のも持っUPDATE
ています。
Customer
クラススイッチをIesiコレクションに変更した場合:
私は期待される振る舞いをしました:
これは私のEntityGuid
クラスです:
何が起こっているのかを理解するのを手伝ってくれる人はいますか?
よろしく。
誰かが本当にコードを見てみたいと思っているなら。私はすべてをきれいにし、それを可能な限り単純にしました。ここからダウンロードできます(NH_CollectionProblems)。
NHibernate3.3.2.4000を使用しています
shared - 読み取り専用に近い共有リストへの非同期アクセス
PlanetInfo
新しいニーズが作成されることはまれですが、発生します。作成されてPlanetInfo
追加されるとInfos.planets
、決して削除されません。ほとんどの場合、Infos.planets
実際には読み取り専用です。
のインスタンスを持つ多くのスレッドがありFoo
、それらはすべてオブジェクトへのポインタを必要としPlanetInfo
ます。ご覧のとおり、internal_getPlanetInfo
同期されています。
コードを変更できるかどうか疑問に思うので、目的のPlanetInfo
. 最初の試行はAsynchronouslyになり、(見つからない場合は) 2 回目はsynchronouslyになります。そう... メソッドgetPlanetInfo
は、メソッドと同じ for ループを変更しますinternal_getPlanetInfo
。したがって、ほとんどの場合、スレッドは互いにロックしません。
私が念頭に置いているのは、スレッドには の「古い」コピーがある可能性があるということInfos.planets
です。この「古い」コピーの唯一の潜在的な問題は、しばらくしてから追加された項目が失われることです。そのため、目的のアイテムが見つからない場合は、 「マスター」コピーを使用して探します。
コメントをいただければ幸いです。
私がやります。
c# - エラーが発生するのはなぜですか:「System.Collections.Generic.List 型を暗黙的に変換できません」
次の封印されたクラスがあります。リストを として返そうとしていReadOnlyCollection
ます。いくつかのことを試しましたが、私はこれのこつを得ていません。では、リストを読み取り専用コレクションに返す、またはキャストするにはどうすればよいでしょうか。
c# - 読み取り専用の int 配列を更新しますか?
古典的な意味では、読み取り専用オブジェクトはコンストラクターでのみ設定でき、後で変更することはできません。読み取り専用の int 配列の動作が異なるのはなぜですか。
PS:私はReadonly
コレクションを認識しています。なぜこれが許可されているのか知りたいのですが?
c# - IXmlSerializable を実装せずに読み取り専用コレクションをシリアル化する
私はクラスを持っています:
XmlSerializer を使用して XML でシリアル化したいのですが、FxCop にも準拠する必要があります。問題は、FxCop がプロパティの読み取り専用コレクションのみを公開したいということですが、もちろん ReadOnlyCollection はシリアル化できません。IXmlSerializable は面倒なので実装したくありません。他の解決策はありますか?