المؤشرات في C# وما مدى تكرار استخدامها في التطبيق؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

بالنسبة لي، كان المؤشر من أصعب المفاهيم في لغات البرمجة في لغة C++.عندما كنت أتعلم لغة C++، قضيت قدرًا هائلاً من الوقت في تعلمها.ومع ذلك، فأنا أعمل الآن بشكل أساسي في مشاريع مكتوبة بالكامل بلغات مثل C# وVB.NET وما إلى ذلك.في واقع الأمر، لم أتطرق إلى لغة C++ منذ ما يقرب من 4 سنوات.على الرغم من أن C# يحتوي على مؤشر، إلا أنني لم أواجه الموقف الذي يجب أن أستخدم فيه المؤشر في C#.لذا فإن سؤالي هو، ما هي أنواع الإنتاجية التي يمكننا الحصول عليها في لغة C# باستخدام المؤشر؟ما هي الحالات التي يجب فيها استخدامات المؤشر؟

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

المحلول

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

نصائح أخرى

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

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

ويمكنني استخدام المؤشرات في C # فقط في حالات نادرة أن يكون في الغالب علاقة مع إرسال / استقبال البيانات، حيث لديك لتحويل صفيف بايت إلى البنية والعكس بالعكس. على الرغم من ذلك، لم يكن لديك للتعامل مع مؤشرات مباشرة عادة.

في بعض الحالات، يمكنك استخدام المؤشرات لتحسين الأداء، لأنه مع Marshaller، وأحيانا يكون لديك لنسخ ذاكرة الوصول إلى البيانات، في حين مع مؤشرات، يمكنك الوصول إليه مباشرة (اعتقد Bitmap.Lock()).

أنا شخصياً لم أحتاج أبدًا إلى استخدام مؤشر في C#.إذا كنت بحاجة إلى هذا النوع من الوظائف، فأنا أكتب هذا الرمز في C++/CLI، وأسميه من C#.إذا كنت بحاجة إلى تمرير المؤشرات من C# إلى C++/CLI أو العكس، فأنا أمررها كأداة IntPtr وأرسله إلى النوع الذي أحتاجه في C++/CLI.

في رأيي - إذا كنت تستخدم المؤشرات في لغة C#، ففي 99% من الحالات، فإنك تستخدم اللغة بشكل خاطئ.

يحرر:الشيء الجميل في C++/CLI هو أنه يمكنك وضع علامة على الفئات الفردية للتجميع الأصلي فقط.أقوم بالكثير من أعمال معالجة الصور التي يجب أن تتم بسرعة كبيرة؛يستخدم الكثير من التعليمات البرمجية المستندة إلى المؤشر.لدي عمومًا كائن C++/CLI مُدار يعيد توجيه المكالمات إلى كائن C++ أصلي حيث تتم المعالجة.أقوم بتشغيل التحسينات لهذا الكود الأصلي والفيولا، وأحصل على مكاسب جيدة في الأداء.

من المؤكد أن هذا لا يهم إلا إذا كان مكاسب الأداء التي تحصل عليها من خلال تنفيذ التعليمات البرمجية الأصلية والمحسّنة يمكن أن تعوض الحمل الزائد للانتقالات المُدارة إلى غير المُدارة.في حالتي، يحدث ذلك دائمًا.

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