سؤال

ما هو الأساس المنطقي لاستخدام الأرقام الموقعة كفهارس في .NET؟

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

ليس هذا قد أحتاج إلى فهرسة المصفوفات أكثر من 247،483،647 في الحجم ، لكنني حقًا لا أستطيع أن أفهم سبب اختيارهم للأرقام الموقعة.

هل يمكن أن يكون ذلك لأنه من الطبيعي استخدام الأرقام الموقعة في الكود؟

تحرير: لقد وجدت هذه الروابط للتو:

مخاطر التكرار غير الموقّعة في C/C ++

موقعة أطوال وفهرسات الكلمات

EDIT2: حسنًا ، تم نشر بعض الأسباب الجيدة الأخرى من الخيط ماثيو فلاسشن:

  • الأسباب التاريخية لأنها لغة تشبه C
  • interop مع ج
هل كانت مفيدة؟

المحلول

للبساطة بالطبع. هل تحب مشكلة القيام بحجم الحساب مع int غير موقعة؟

نصائح أخرى

قد يكون التقليد الطويل في استخدام قيمة أقل من 0 كفهرس غير صالح. طرق مثل string.indexof return -1 إذا لم يتم العثور على العنصر. لذلك ، يجب توقيع قيمة الإرجاع. إذا كان المستهلكون الفهرس يتطلبون قيمًا غير موقعة ، فسيتعين عليك التحقق و B) التي يلقي القيمة لاستخدامها. مع مؤشرات موقعة ، تحتاج فقط إلى الشيك.

غير موقعة ليست متوافقة CLS.

تنشأ الفائدة الأساسية للأرقام غير الموقعة عند تكوين أعداد أكبر من الأرقام الأصغر والعكس بالعكس. على سبيل المثال ، إذا تلقى المرء أربعة بايت غير موقّع من اتصال ويرغب في اعتبار قيمته ، مع اعتباره ككلًا ، كصاحب صحيح 32 بت ، باستخدام أنواع غير موقعة يعني ببساطة أن يقول:

  value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216);

على النقيض من ذلك ، إذا تم توقيع البايتات ، فإن تعبيرًا مثل ما سبق سيكون أكثر تعقيدًا.

لست متأكدًا من أنني أرى حقًا أي سبب للغة مصممة في الوقت الحاضر بعدم تضمين إصدارات غير موقعة من جميع الأنواع أقصر من أطول نوع عدد صحيح موقّع ، مع دلالات جميعها (بمعنى أن الأنيابة المنفصلة ، بدلاً من أي نوع معين ) يتم تنفيذ العمليات التي ستناسب بالكامل ضمن أكبر نوع موقّع افتراضيًا مع ان كانوا يعملون على هذا النوع. إن تضمين إصدار غير موقّع من أكبر نوع موقّع من شأنه أن يعقد مواصفات اللغة (حيث يتعين على المرء تحديد العمليات التي يجب أن تتناسب مع نطاق النوع الموقّع ، والتي يجب أن تتناسب العمليات في نطاق النوع غير الموقّع) ، ولكن يجب أن تكون هناك خلاف ذلك لا مشكلة في تصميم لغة if (unsigned1 - unsigned2 > unsigned3) من شأن unsigned2 أكبر من unsigned1 إذا أراد المرء التفاف غير موقّع ، فإن المرء يحدد صراحة if ((Uint32)(unsigned1 - unsigned2) > unsigned3)]. إن اللغة التي حددت مثل هذا السلوك ستكون بالتأكيد تحسناً كبيرًا على الفوضى الموجودة في C (مبررة ، بالنظر إلى تاريخها) أو C#أو VB.NET.

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