سؤال

أنا مرتبك بعض الشيء بشأن حقيقة أنه في C# فقط ، يتم جمع الأنواع المرجعية. وهذا يعني أن GC يختار فقط أنواع المرجعية لإزالة التخصيص في الذاكرة. إذن ماذا يحدث مع أنواع القيمة لأنها تشغل الذاكرة أيضًا على المكدس؟

هل كانت مفيدة؟

المحلول

لبداية ، سواء كانوا على المكدس أو جزء من الكومة يعتمد على السياق الذي هم جزء منه - إذا كانوا ضمن نوع مرجعي ، فسيكونون على الكومة على أي حال. (يجب أن تفكر في مدى اهتمامك حقًا بتقسيم المكدس/الكومة على أي حال - كما كتب إريك ليبرت ، إنه إلى حد كبير تفاصيل التنفيذ.)

ومع ذلك ، يتم استرداد ذاكرة نوع القيمة بشكل أساسي عند استرداد السياق - لذلك عندما يتم عرض المكدس من خلال العودة من طريقة ، "يسترد" إطار المكدس بالكامل. وبالمثل ، إذا كانت قيمة نوع القيمة هي في الواقع جزء من كائن ، فسيتم استرداد الذاكرة عندما يتم جمع القمامة.

الإجابة المختصرة هي أنه لا داعي للقلق بشأنه :) (هذا يفترض أنه ليس لديك أي شيء آخر من الذاكرة التي تقلق بشأنها ، بالطبع - إذا كنت قد حصلت على هياكل مع إشارات إلى المقابض الأصلية التي تحتاج إلى إطلاق ، فهذا سيناريو مختلف إلى حد ما.)

نصائح أخرى

أنا مرتبك بعض الشيء بشأن حقيقة أنه في C# فقط ، يتم جمع الأنواع المرجعية.

هذه ليست حقيقة. أو ، بدلاً من ذلك ، تعتمد حقيقة أو زيف هذا البيان على ما تعنيه "الحصول على القمامة جمع". من المؤكد أن جامع القمامة ينظر إلى أنواع القيمة عند التجميع ؛ قد تكون أنواع القيمة هذه حية وتتمسك بنوع مرجعي:

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

عندما يدير جامع القمامة ، ينظر بالتأكيد إلى S ، لأنه يحتاج إلى تحديد أن S.Str لا يزال على قيد الحياة.

اقتراحي: توضيح على وجه التحديد ما تقصده بالفعل "يتم جمع القمامة".

يختار GC أنواع المرجع فقط لإلغاء التخصيص الذاكرة.

مرة أخرى ، هذه ليست حقيقة. افترض أن لديك مثال

class C { int x; }

ستكون ذاكرة عدد صحيح على الكومة التي تم جمعها القمامة ، وبالتالي تم استصلاحها بواسطة جامع القمامة عندما يصبح مثيل C غير مجذر.

لماذا تصدق الباطل الذي لا يتم تخصيص ذاكرة الأنواع المرجعية إلا من قبل جامع القمامة؟ البيان الصحيح هو تلك الذاكرة التي كانت مخصص بجانب جامع القمامة تعامل من قبل جامع القمامة ، والذي أعتقد أنه منطقي تمامًا. خصصته GC بحيث يكون مسؤولاً عن تنظيفه.

إذن ماذا يحدث مع أنواع القيمة لأنها تشغل الذاكرة أيضًا على المكدس؟

لا شيء على الإطلاق يحدث لهم. لا شيء يجب أن يحدث لهم. المكدس هو مليون بايت. يتم تحديد حجم المكدس عندما يبدأ الخيط ؛ يبدأ بمليون بايت ويبقى مليون بايت طوال تنفيذ الخيط بأكمله. لا يتم إنشاء الذاكرة على المكدس أو تدميرها ؛ يتم تغيير محتوياتها فقط.

هناك الكثير من الأفعال المستخدمة في هذا السؤال ، مثل التدمير ، المستصلحة ، المعالجة ، إزالتها. هذا لا يتوافق بشكل جيد مع ما يحدث بالفعل. متغير محلي يتوقف ببساطة عن أن يكون ، نمط الببغاء النرويجي.

تحتوي الطريقة على نقطة دخول واحدة ، أول ما يحدث هو أنه يتم ضبط مؤشر مكدس وحدة المعالجة المركزية. إنشاء "إطار مكدس" ، مساحة تخزين للمتغيرات المحلية. يضمن CLR تهيئة هذه المساحة إلى 0 ، وليس بخلاف ذلك ميزة تستخدمها بقوة في C# بسبب قاعدة المهمة المحددة.

الطريقة تحتوي على نقطة واحدة من الخروج ، حتى لو كنت رمز الطريقة يتغلب على متعددة return صياغات. عند هذه النقطة ، تتم استعادة مؤشر المكدس ببساطة إلى قيمته الأصلية. في الواقع "ينسى" أن المتغيرات المحلية من أي وقت مضى. لا يتم "تنظيف" قيمها بأي شكل من الأشكال ، لا تزال البايتات موجودة. لكنها لن تدوم طويلاً ، فإن المكالمة التالية في برنامجك ستستمر في الكتابة مرة أخرى. تضمن قاعدة CLR Zero initialization أنه لا يمكنك أبدًا ملاحظة تلك القيم القديمة ، والتي ستكون غير آمنة.

لا تأخذ بسرعة كبيرة جدًا أكثر من دورة معالج واحدة. التأثير الجانبي المرئي لهذا السلوك في لغة C# هو أن أنواع القيمة لا يمكن أن تحتوي على نهائيات. ضمان عدم وجود عمل إضافي يجب القيام به.

تتم إزالة نوع القيمة على المكدس من المكدس عندما يخرج من النطاق.

أخبرني أولا أن هذا ممكن جدا، لكنه لن يكون بدون قدر كبير من الجهد في التفكير من خلال التصميم المناسب وفي تنفيذها. لا يوجد إصلاح سريع هنا، بعد أن قال ذلك هنا خياراتك.

ما تحتاجه أساسا للنظر في المطالبات المعززة، وهذا يعني أنك بحاجة إلى وسيلة لزيادة مجموعة المطالبات التي يدركها SharePoint للمستخدمين المصادق عليهم. يتيح لك SharePoint تأمين العناصر ضد المطالبات.

يمكنك القيام بتزوير ادعاءات بعدة طرق، لكن اثنين الأكثر شيوعا هي:

adfs - لقد ألمحت بالفعل في هذا ولكن إذا تم استخدام ADFS كمزود هوية مخصص للتطبيق الخاص بك، فيمكنك استخدام قواعد مطالبة ADFS ومتاجر السمة للاستعلام عن قاعدة بيانات SQL وتعيين مطالبات جديدة لمستخدمك. ثم تحتاج فقط إلى تأمين SharePoint باستخدام هذه المطالبات الجديدة. إذا كنت تتبع هذا المسار، فكل شيء قرأ كل ما نشره ستيف بيسشكا على هذا الموضوع، بدءا من هذا:

http://blogs.technet.com/b/speschka/archive/2010/07/30/configuring-sharepoint-201-and-adfs-v2-end-to-end.aspx

للعثور على مزيد من المعلومات حول استخدام متجر سمة SQL في ADFS لزيادة المطالبات إلقاء نظرة على هذا:

http://blogs.technet.com/b/vinitt/archive/2013/04/15/how-to-use-custom-sql- ادعاءات المتاجر إلى توليدها - and-and fellize-user.aspx

مزود المطالبة المخصصة - يمكنك كتابة مزود مطالبة مخصصة ل SharePoint وتسجيله مقابل تطبيق الويب الخاص بك، وستحتاج إلى كتابة جميع التعليمات البرمجية لاستعلام قاعدة البيانات ومعالجة القيم المرتجعة، ولكن أفترض أن هذه ليست مشكلة. يمنحك هذا الخيار بالفعل المزيد من السيطرة على تجربة المستخدم في تأمين SharePoint لأن ADFS الخاص به لن يسمح لك بإدمج أي جوانب صحيحة أو بحث في منتقي المطالبة (منتقي الأشخاص). في الواقع أسوأ مما يبدو أنه يبدو أن أي قيمة مفادها في منتقي الناس صالحة سواء كانت قيمة سمة صالحة أم لا، فهذا مفتوح للغاية في الخطأ البشري عند تأمين العناصر في SharePoint لذلك قد ترغب في التفكير في الهجين نهج يستخدم ADFS لتعزيز المطالبات، ولكن لديه مزود مطالبي مخصص أيضا للسماح لك بالبحث عن أسماء SQL الخاصة بك وحلها من قاعدة بيانات SQL الخاصة بك.

المزيد من المعلومات ونقطة انطلاق لمقدمي المطالبات المخصصة يمكن العثور عليها هنا:

http://msdn.microsoft. COM / EN-US / Library / GG615945٪ 28V= Office.14٪ 29.aspx

على الرغم من أن Steve Peschka قد كتب الكثير من مشاركات المدونة في هذا الموضوع وأوصي بإلقاء نظرة على كل منهم أثناء بناء تصميم.

هذه مجرد بداية في الاتجاه الصحيح وليس لديك شك في أن لديك المزيد من الأسئلة قبل أن تحصل على جميع الإجابات التي تحتاجها.

نأمل أن يساعد.

سيتم توحيد أنواع القيمة عند إزالة إطار المكدس بعد تنفيذها ، سأفترض

ترغب أيضًا في إضافة أن المكدس على مستوى مؤشر ترابط ، والكوتين على مستوى مجال التطبيق.

لذلك ، عندما ينتهي الخيط ، فإنه سيسترجع ذاكرة المكدس التي يستخدمها هذا الموضوع المحدد.

سيكون كل مثيل نوع القيمة في .NET جزءًا من شيء آخر ، والذي يمكن أن يكون مثيلًا أكبر لقيمة المرفق أو كائن كومة أو إطار مكدس. كلما ظهر أي من هذه الأشياء ، فإن أي هياكل بداخلها ستظهر أيضًا ؛ ستستمر هذه الهياكل في الوجود طالما أن الشيء الذي يحتوي عليها. عندما يتوقف الشيء الذي يحتوي على الهيكل ، فإن الهيكل سوف كذلك. لا توجد طريقة لتدمير هيكل دون تدمير الحاوية ، ولا توجد طريقة لتدمير شيء يحتوي على واحدة أو أكثر من الهياكل دون تدمير الهياكل الموجودة فيه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top