سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لماذا Array.Length إنت، وليس أ uint.هذا يزعجني (قليلاً) لأن قيمة الطول لا يمكن أن تكون سالبة أبدًا.

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

لذا فإن السؤال النهائي هو:هل هناك أي فائدة لـ int غير الموقعة (uint)؟حتى مايكروسوفت يبدو أنها لا تستخدمها.

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

المحلول

Unsigned int ليس متوافقًا مع CLS وبالتالي سيقيد استخدام الخاصية لتلك اللغات التي تنفذ UInt.

انظر هنا:

الإطار 1.1

مقدمة إلى مكتبة فئة .NET Framework

الإطار 2.0

نظرة عامة على مكتبة فئات .NET Framework

نصائح أخرى

أسباب عديدة:

  • uint ليس متوافقًا مع CLS، وبالتالي فإن إنشاء نوع (صفيف) مدمج عليه قد يكون مشكلة
  • يمنع وقت التشغيل كما تم تصميمه في الأصل أي كائن في الكومة يشغل أكثر من 2 جيجابايت من الذاكرة.نظرًا لأن الحد الأقصى لحجم المصفوفة الذي سيكون أقل من أو يساوي هذا الحد سيكون بايتًا جديدًا[int.MaxValue]، فسيكون من المحير للأشخاص أن يكونوا قادرين على إنشاء أطوال مصفوفة موجبة ولكنها غير قانونية.
  • تاريخيًا، ترث لغة C# الكثير من قواعدها النحوية واصطلاحاتها من C وC++.في تلك المصفوفات، يتم ببساطة حساب المؤشر، لذا كانت الفهرسة السلبية للمصفوفة ممكنة (على الرغم من أنها غير قانونية وخطيرة في العادة).نظرًا لأن الكثير من التعليمات البرمجية الموجودة تفترض أن فهرس المصفوفة قد تم توقيعه، فقد يكون هذا عاملاً
  • في ملاحظة ذات صلة، فإن استخدام الأعداد الصحيحة الموقعة لفهارس المصفوفات في C/C++ يعني أن التشغيل المتداخل مع هذه اللغات والوظائف غير المُدارة سيتطلب استخدام ints في تلك الظروف على أي حال، مما قد يربك بسبب عدم الاتساق.
  • يعتمد تنفيذ BinarySearch (مكون مفيد جدًا للعديد من الخوارزميات) على القدرة على استخدام النطاق السلبي لـ int للإشارة إلى عدم العثور على القيمة و الموقع الذي يجب إدراج هذه القيمة فيه للحفاظ على الفرز.
  • عند العمل على مصفوفة، فمن المحتمل أنك قد ترغب في الحصول على إزاحة سالبة لفهرس موجود.إذا استخدمت إزاحة من شأنها أن تأخذك إلى ما بعد بداية المصفوفة باستخدام الوحدة، فإن سلوك الالتفاف قد يجعل الفهرس الخاص بك قانونيًا (بحيث يكون إيجابيًا).باستخدام int ستكون النتيجة غير قانونية (ولكنها آمنة نظرًا لأن وقت التشغيل سيحمي من قراءة ذاكرة غير صالحة)

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

يبدو أن أحداً لم يقدم إجابة على "السؤال الأخير".

أعتقد أن الاستخدام الأساسي لـ ints غير الموقعة هو توفير واجهة أسهل مع الأنظمة الخارجية (P/Invoc وما شابه) ولتغطية احتياجات اللغات المختلفة التي يتم نقلها إلى .NET.

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

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

مع مجموعة من البايتات، سيعطيك Int32 2 غيغابايت من القيم

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