問題タブ [framework-design]

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.

0 投票する
4 に答える
12963 参照

.net - MethodImplOptions.InternalCall のポイントは何ですか?

BCL の多くのメソッドは、 [MethodImpl(MethodImplOptions.InternalCall)]属性でマークされています。これ、「メソッドが共通言語ランタイム自体に実装されている」ことを示します。

ランタイムが強制的に実装する明示的な CIL 命令を指定するよりも、このようにフレームワークを設計するポイントは何でしたか? 最終的に、属性はランタイムの契約上の義務を作成しますが、私には混乱を招き、すぐには明らかではないように見えます。

たとえば、次のMath.Powように記述することもできます (C# + IL と IL 自体の非公式な混合が悪い場合は申し訳ありません。これは私の要点を説明するためのサンプルにすぎません)。

現在の方法の代わりに:

なぜMethodImplOptions.InternalCall存在するのですか?

0 投票する
2 に答える
609 参照

c# - ジェネリック コレクションの継承

私はMVVMでWPFアプリを構築しており、ObservableCollectionを使用しています。ViewModel で作業しているときに、ObservableCollection の型定義を調べることにしましたが、奇妙なことに気付きました。

さて、ここで質問です:

これは本当にどのように実装されているのですか、それともこの VS2010 が私にいたずらをしているのですか?

0 投票する
1 に答える
504 参照

c# - C#で任意のオブジェクトタイプをロックできるのはなぜですか?

誰かがC#の任意のタイプのオブジェクトでそれが可能である理由を詳細に説明できますか?lock

lockのために、どのように使うのか理解しています。私はそれがMonitor.Enter/にどのように拡張するかを知っていますExit。実装の詳細と設計上の考慮事項の説明を探しています。

まず第一に:内部で何が起こっているのですか?例:オブジェクトインスタンスに(RTTI / vtableの場合のように)それを機能させる余分なビットがありますか?または、オブジェクト参照をキーとするある種のルックアップテーブルですか?(もしそうなら、これはGCとどのように相互作用しますか?)または何か他のもの?ロックデータが何であれ、保持するために特定のタイプのインスタンスを作成する必要がないのはなぜですか?

(ちなみに、ネイティブコードでは何をしEnterてマップしますか?)Exit

そして、第二に、なぜ.NETはロックを解除するための特定のタイプを持たないように設計されているのですか?(とにかく目的のために作成するのが一般的であり、new object()「古いオブジェクト」をロックするほとんどの場合は問題があります。)この設計の選択は、実装の詳細によって強制されましたか?それとも意図的でしたか?そして、意図的にすれば、それは良い選択でしたか?(この2番目の部分には推測が必要な場合があることを理解しています。)

0 投票する
3 に答える
256 参照

ruby-on-rails - ActiveRecord::Baseの背後にある理論/根拠

Railsの初心者です。

私が目にするほとんどのコード サンプルの非常に先端的な部分の背後にある理論を理解するのを手伝ってくれませんか? 「The ActiveRecord::Base」、「Application Controller」、「ActionController::Base」の部分は?

  1. この3つを何と呼びますか?それらはすべてオブジェクトですか?クラス?

  2. 「class X < ActiveRecord::Base」はモデルでオブジェクトを作成することであり、「class ApplicationController < ActionController::Base」はコントローラーでオブジェクトを作成することであると理解しています...オブジェクトを作成するための同様のものはありますかView では、MVC の 3 つのコンポーネントすべてを丸めるだけですか?

0 投票する
2 に答える
1271 参照

c# - 再利用可能な .NET ライブラリで前方互換性を有効にする方法は?

私は、私のおもちゃプロジェクトの新しいマイナー リリースを作成中です。このプロジェクトは NuGet でリリースされ、.NET 4.0 以降と互換性があります。私が導入している新機能のいくつかは .NET 4.5 を必要とします (.NET 4.5 で導入された両方のインターフェースをユーザーが解決できる必要がありIReadOnlyCollection<T>ますIReadOnlyList<T>) が、プロジェクトを .NET 4.0 と互換性を保つ必要があります。最新の .NET フレームワークに簡単に移行できます。

したがって、私が直面している問題は、この「前方互換性」の問題を解決する方法です。私が考えた解決策は 2 つありますが、どちらもあまり魅力的ではないので、ここで誰かがアイデアやガイダンスを提供してくれることを願っています。

私が思いついた2つの解決策は次のとおりです。

解決策 1:#ifコンパイラ ディレクティブを使用し、.NET Framework バージョンごとに DLL をビルドし、NuGet パッケージを使用してそれらのバージョンを出荷し、プロジェクト サイトでダウンロードします。

この方法の欠点は、開発者が Visual Studio プロジェクトを .NET 4.0 から .NET 4.5 に更新するときに、(.NET 4.5 固有の機能を含む) .NET 4.5 バージョンを自動的に取得しないことです。これは最小の驚きの原則に違反しており、開発者が数か月後に機能を使用しようとすると、なぜ機能が機能しないのか頭が混乱することになります。

解決策 2: 1 つの DLL を使用し、現在のアプリ ドメインに存在する場合に両方の新しいインターフェイスを実装する型をオンザフライで発行します。これにより、単一の DLL をユーザーに配布でき、開発者がプロ​​ジェクトで .NET フレームワークのバージョンを切り替えたときに機能を利用できるようになります。これにより、物事が「うまくいく」ようになります。これは、私が現在向かっている方向です。

インターフェイスを実装する必要がある型を返す必要があるため、Reflection.Emit、ModuleBuilder、TypeBuilder などを使用して実行時にその型を作成する必要があるという欠点があります。これは非常に厄介なシズルです。しかし、それ以外にも、この型は新しい (匿名) アセンブリで作成する必要があるため、いくつかの内部型 (継承する必要がある型と実装する必要があるインターフェイス) を公開する必要があります。これらの内部型を公開すると、プロジェクトの API が汚染され、それらの型を変更できなくなります。

これらは私の選択肢だと思いますが、明らかな何かが欠けている可能性があります。だから私の質問は、私は可能性を見逃していますか? ソリューション 1 の問題を回避する方法はありますか、それともランタイム タイプの発行のハードコア ルートを使用する方がよいでしょうか?

0 投票する
1 に答える
476 参照

design-patterns - Asp.Net ID インターフェイスの設計戦略を理解する

Asp.net Identity Framework で提供されるすべてのI*Store<TUser>インターフェイスは から継承されてIUserStore<TUser>います。これにより、すべてのインターフェースの実装にユーザー関連のメソッドを実装するか、単一のクラスにそれらすべてを継承させることが強制されます。

  • IUserClaimStore<TUser>
  • IUserPasswordStore<TUser>
  • IUserLoginStore<TUser>
  • IUserSecurityStampStore<TUser>

ログイン、パスワード、クレーム、またはセキュリティスタンプに別のストレージを提供する必要がある場合、たとえば EF や任意の DB の代わりに Xml ストレージを提供する必要がある場合は、ユーザー関連のメソッドも実装する必要があります (ユーザー: CreateAsync、UpdateAsync、DeleteAsync、FindByIdAsync、FindByNameAsync)。

では、このアーキテクチャを提供する背後にある戦略は何でしょうか?