سؤال

افترض أن رمز C# هذا:

using (MemoryStream stream = new MemoryStream())
{
    StreamWriter normalWriter = new StreamWriter(stream);
    BinaryWriter binaryWriter = new BinaryWriter(stream);

    foreach(...)
    {
        binaryWriter.Write(number);
        normalWriter.WriteLine(name); //<~~ easier to reader afterward.
    }

    return MemoryStream.ToArray();
}

أسئلتي هي:

  1. هل أحتاج إلى استخدام التدفق داخل حلقة للحفاظ على النظام؟
  2. يعود MemoryStream.ToArray() قانوني؟أنا باستخدام using-block كاتفاقية، أخشى أن ذلك سوف يفسد الأمور.
هل كانت مفيدة؟

المحلول

اخدش الإجابة السابقة - لم ألاحظ أنك تستخدم غلافين حول نفس الدفق.هذا يبدو محفوفًا بالمخاطر إلى حد ما بالنسبة لي.

وفي كلتا الحالتين، أود أن أضع StreamWriter و BinaryWriter في ملكيتهم using كتل.

أوه، ونعم، من القانوني الاتصال ToArray() على ال MemoryStream - يتم الاحتفاظ بالبيانات حتى بعد التخلص منها.

إذا كنت تريد حقًا استخدام الغلافين، فسأفعل ذلك على النحو التالي:

using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter normalWriter = new StreamWriter(stream))
    using (BinaryWriter binaryWriter = new BinaryWriter(stream))
    {
        foreach(...)
        {
            binaryWriter.Write(number);
            binaryWriter.Flush();
            normalWriter.WriteLine(name); //<~~ easier to read afterward.
            normalWriter.Flush();
        }
    }    
    return MemoryStream.ToArray();
}

يجب أن أقول إنني حذر إلى حد ما من استخدام غلافين حول نفس الدفق.سيتعين عليك الاستمرار في مسح كل منها بعد كل عملية للتأكد من عدم حصولك في النهاية على بيانات غريبة.يمكنك ضبط StreamWriterAutoFlush الملكية صحيحة للتخفيف من الوضع، وأنا يعتقد الذي - التي BinaryWriter حاليا لا في الحقيقة تتطلب التنظيف (أيلا يقوم بتخزين أي بيانات مؤقتًا) ولكن الاعتماد على ذلك يبدو محفوفًا بالمخاطر.

إذا كان عليك خلط البيانات الثنائية والنصية، فسأستخدم ملف BinaryWriter واكتب بايتات السلسلة بشكل صريح، وجلبها باستخدام Encoding.GetBytes(string).

نصائح أخرى

تحديث

لا يهم هذه الإجابة ، لقد احترت مع الكتاب ...


  1. لا، سيتم الحفاظ على الطلب (تحديث: ربما لا).يعد Flush مفيدًا/مطلوبًا في مواقف أخرى، على الرغم من أنني لا أتذكر متى.
  2. أعتقد ذلك، استخدام يتأكد من أن كل شيء ينظف بشكل جيد.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top