質問

C#では、参照タイプのみがガベージを収集するという事実について少し混乱しています。つまり、GCはメモリ脱アラケーションの参照タイプのみを選択します。では、Stackのメモリも占有しているため、値タイプはどうなりますか?

役に立ちましたか?

解決

最初は、スタック上にあるか、ヒープの一部であろうと、それらがどのコンテキストの一部であるかによって異なります - 参照タイプ内にある場合、とにかくヒープにあります。 (とにかくスタック/ヒープの分裂を本当に気にかけていることを検討する必要があります - エリック・リパートが書いたように、それは 主に実装の詳細.)

ただし、基本的に値タイプメモリは、コンテキストが回収されたときに回収されます。そのため、スタックがメソッドから戻ってきたことによってスタックがポップされたとき、スタックフレーム全体を「回収」します。同様に、値タイプの値が実際にオブジェクトの一部である場合、そのオブジェクトがガベージが収集されたときにメモリが回収されます。

簡単な答えは、あなたがそれについて心配する必要がないということです:)(これはあなたが何も持っていないと仮定します 他の もちろん、心配するメモリよりも - リリースが必要なネイティブハンドルへの参照がある構造体がある場合、それはやや異なるシナリオです。)

他のヒント

C#では、参照タイプのみがガベージを収集するという事実について少し混乱しています。

これは事実ではありません。または、むしろ、この声明の真実または虚偽は、「Get Garbage Collected」の意味に依存します。ゴミコレクターは、収集時に価値のあるタイプを確実に見ています。これらの値タイプは生きており、参照タイプを保持している可能性があります。

struct S { public string str; }
...
S s = default(S); // local variable of value type
s.str = M(); 

ゴミコレクターが実行されると、S.Strがまだ生きていると判断する必要があるため、確かにSを見ます。

私の提案:明確に 正確に 動詞が意味することは「ゴミが集められます」。

GCは、メモリ脱アラケーションの参照タイプのみを選択します。

繰り返しますが、これは事実ではありません。のインスタンスがあるとします

class C { int x; }

整数のメモリは、ガベージが収集したヒープ上にあり、したがって、Cのインスタンスがルートされていないときにガベージコレクターによって回収されます。

参照タイプの記憶のみがガベージコレクターによって扱われているという虚偽をなぜ信じているのですか?正しい声明は、その記憶でした 割り当てられます ゴミコレクターによって 取引 ゴミコレクターによって、これは完全に理にかなっていると思います。 GCはそれを割り当てたので、それを掃除する責任があります。

では、Stackのメモリも占有しているため、値タイプはどうなりますか?

彼らには何も起こりません。彼らに何も起こらない必要はありません。スタックは100万バイトです。スタックのサイズは、スレッドが起動するときに決定されます。それは100万バイトから始まり、スレッドの全体の実行中に100万バイトのままです。スタックのメモリは作成も破壊されません。その内容のみが変更されます。

この質問で使用されている動詞が多すぎます。それは実際に起こることとはうまくいきません。ローカル変数は単に停止します、 ノルウェーのオウムスタイル.

メソッドには単一のエントリポイントがあります。まず、CPUスタックポインターが調整されていることです。 「スタックフレーム」、ローカル変数用のストレージスペースを作成します。 CLRは、このスペースが0に初期化されることを保証します。それ以外の場合は、明確な割り当てルールのためにC#で強力に使用する機能ではありません。

メソッドコードに複数が付いている場合でも、メソッドには1つの出口があります。 return ステートメント。その時点で、スタックポインターは単に元の値に復元されます。実際には、ローカル変数がどこにでもあることを「忘れて」います。それらの値は決して「スクラブ」されていませんが、バイトはまだそこにあります。しかし、彼らは長くは続かないので、あなたのプログラムの次の呼び出しは再びそれらを上書きするでしょう。 CLR Zero Initializationルールは、これらの古い値を決して観察できないことを保証します。

非常に、非常に高速で、単一のプロセッササイクルしか必要ありません。 C#言語でのこの動作の目に見える副作用は、値タイプにファイナルライザーを持たないことです。余分な作業を行う必要がないようにします。

スタック上の値タイプは、スコープがなくなるとスタックから削除されます。

最初にこれが非常に実現可能であると言わせてくださいが、正しいデザインを通して、そしてそれを実装する際にも、かなりの努力がかかりません。ここではここにあなたのオプションがあると言ったクイック解決はありません。

基本的に見ているのは、特許請求の範囲、すなわち、SharePointが認証されたユーザーに気付いているクレームのセットを強化する方法が必要です。 SharePointを使用すると、クレームに対してアイテムを保護できます。

あなたはいくつかの方法で強化をすることができますが、最も一般的な2つは次のとおりです。

adfs - すでにこれに答えていますが、アプリケーションのカスタムIDプロバイダとしてADFSが使用されている場合は、ADFSクレームルールと属性ストアを使用してSQLデータベースをクエリして新しいクレームを割り当てることができます。あなたのユーザーに。その後、これらの新しいクレームを使用してSharePointを安全に保護する必要があります。このルートをフォローしている場合は、基本的にSteve Peschkaがこれから始めています。

htep://blog="http://blogs.technet.com/b/speschka/archive/2010/07/30/configing-SharePoint-2010-and-adfs-v2-endto-end.aspx" rel="nofollow"> http://07/30/2010/07/30/configing-sharepoint-2010-and-adfs-v2-end-to-end.aspx

ADFSでSQL属性ストアを使用する方法について詳しく説明すると、主張はこれを見てみましょう。

http://blogs.technet.com/b/vinitt/archive/2013/04/15/how-to-to-to-custom-sql - attribute-store-to-generation-and-authorize-user.aspx

カスタムクレームプロバイダー - あなたはSharePointのカスタムクレームプロバイダを書くことができ、それをあなたのWebアプリケーションに対して登録することができます、あなたはデータベースを照会して返された値を処理するためにすべてのコードを書く必要がありますが、私はそれが問題ではないと仮定しています。このオプションは実際にはSharePointを自分でADFSとして保護する際のユーザーエクスペリエンスをより多くの制御を行います。実際には、People Pickerで検索された値は、有効な属性値として存在するかどうかが有効であると表示されます。ハイブリッドを検討することをお勧めしますので、Sharebointでアイテムを保護するときには人間のエラーが発生します。クレームの増大のためにADFを使用するが、SQLデータベースからの名前を検索して解決できるようにするためにカスタムクレームプロバイダを持っています。

カスタムクレームプロバイダの詳細情報と出発点はここで見つけることができます:

http://msdn.microsoft。 COM / ja-us / library / GG615945%28V= Office.14%29.aspx

再びSteve Peschkaはこのテーマにたくさんのブログ投稿を書いてきました。

これは正しい方向のキックスタートです。あなたがあなたが必要とするすべての答えを得る前にあなたがより多くの質問があるでしょう。

助けを願っています。

スタックフレームが実行された後に削除されたときに、値の種類が扱われるでしょう

また、スタックがスレッドレベルにあり、ヒープはアプリケーションドメインレベルにあることを追加したいと考えています。

したがって、スレッドが終了すると、その特定のスレッドで使用されるスタックメモリを再生します。

.NETのすべての値タイプインスタンスは、他の何かの一部になります。これは、より大きな囲まれた値タイプインスタンス、ヒープオブジェクト、またはスタックフレームです。それらのもののいずれかが存在するときはいつでも、それらの中の構造も存在します。これらの構造は、それらを含むものがそうである限り、存在し続けます。構造を含むものが存在しなくなると、構造も同様になります。容器を破壊せずに構造を破壊する方法はなく、そこに含まれる構造を破壊せずに1つ以上の構造を含むものを破壊する方法はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top