الاختلافات بين Dictionary.Clear والقاموس الجديد ()

StackOverflow https://stackoverflow.com/questions/1400532

  •  05-07-2019
  •  | 
  •  

سؤال

ما هي الاختلافات الرئيسية بين Dictionary.Clear و new Dictionary() شركة#؟أيهما ينصح به وفي أي الحالات؟

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

المحلول

وDictionary.Clear() سيزيل كل من أزواج KeyValue في القاموس. وسوف نفعل new Dictionary() إنشاء مثيل جديد من القاموس.

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

وDictionary.Clear() سيجعل أزواج KeyValue متاحة للتنظيف.

في الممارسة العملية، وكلا الخيارين تميل إلى أن يكون لها آثار مشابهة جدا. سيكون الفرق ما يحدث عند استخدام هذا داخل أسلوب:

void NewDictionary(Dictionary<string,int> dict)
{
   dict = new Dictionary<string,int>(); // Just changes the local reference
}

void  ClearDictionary(Dictionary<string,int> dict)
{
   dict.Clear();
}

// When you use this...
Dictionary<string,int> myDictionary = ...; // Set up and fill dictionary

NewDictionary(myDictionary);
// myDictionary is unchanged here, since we made a new copy, but didn't change the original instance

ClearDictionary(myDictionary);
// myDictionary is now empty

نصائح أخرى

وكما تمت تغطية على نطاق واسع، وآثار لا تختلف في جوهرها. سوف Clear() وnew كلا تعطيك قاموس جديد، والتخلي عن أساسا ما يشير إلى الكائنات داخل منه، واطلاق سراحهم ليتم جمعها إذا أصبحوا unrooted.

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

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

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

قاموس جديد()
إنشاء كائن قاموس جديد في الذاكرة والتخلي عن الكائن الأصلي.سيتم مسح الذاكرة أثناء دورة تجميع البيانات المهملة التالية.

وأعتقد أن الفرق الرئيسي هو أنه إذا كان استدعاء Dictionary.Clear()، سيتم مسح كل ما يشير إلى أن القاموس. إذا كنت تستخدم new Dictionary()، ثم المرجع الذي تتعامل معه في ذلك الوقت سيتم مسح (بمعنى)، ولكن جميع الأماكن الأخرى التي لديها والمراجع لا تكون لأنها ستظل مشيرا إلى القاموس القديم.

ونأمل هذا الرمز يوضح ببساطة:

public void Method()
{
    Dictionary<int, int> d1 = new Dictionary();

    d1.Add(1,1);
    d1.Add(2,3);

    Dictionary<int, int> d2 = d1;

    //this line only 'clears' d1
    d1 = new Dictionary();

    d1.Add(1,1);
    d1.Add(3,5);
    d2.Add(2,2);

    //writes '2' followed by '1'
    Console.WriteLine(d1.Count);
    Console.WriteLine(d2.Count);
}

إذا كنت قد دعا d1.Clear() بدلا من ذلك، ثم D1 و D2 قد ظلت على وفاق، ومن شأنه أن يضيف إلى كل من لاحقة يضيف. ان دعوات للإشارة سواء يقم مخرج "3" بدلا من ذلك.

وDictionary.Clear سيزيل (ولكن ليس التصرف) جميع البنود في المقام حين new Dictionary() سوف إنشاء مثيل جديد الذي يحدث لمجرد أن يكون فارغا. قد يكون هناك بعض الآثار الطفيفة بين البلدين. النظر في الأمثلة التالية.

void Example1()
{
  var collection = new Dictionary<string, string>();
  collection.Add("key1", "value1");
  collection.Add("key2", "value2");
  foreach (var kvp in collection)
  {
    collection = new Dictionary<string, string>();
    Console.WriteLine(kvp);
  }
}

void Example2()
{
  var collection = new Dictionary<string, string>();
  collection.Add("key1", "value1");
  collection.Add("key2", "value2");
  foreach (var kvp in collection)
  {
    collection.Clear();
    Console.WriteLine(kvp);
  }
}

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

في المثال الثاني يتم مسح جمع خلال التعداد الذي سيؤدي إلى InvalidOperationException لتم تعديل المجموعة.

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

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

وDictionary.clear وطرد كافة العناصر في قاموسك. قاموس جديد بإنشاء كائن القاموس الجديد في الذاكرة أثناء اليتم قاموس السابق لجمع القمامة لتنظيف لاحقا.

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