سؤال

أنا أستخدم الوظيفة التالية لتفتيح قيم الألوان (إنها lambda في التعليمات البرمجية الخاصة بي، ولكن لا ينبغي أن يؤدي إلى اختلاف):

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return i + (255 - i) \ 2
End Function

لن تجميعها، لأن مترجم يفسر 255 و 2 كعضات بيئة بدلا من البايتات، مما يجعل نتيجة النوع Integer. وبعد للأسف، لا يوجد شخصية نوع البايت, ، لذلك لا أستطيع الكتابة فقط 255B أو شيء من هذا القبيل.

هناك عدد قليل من الحلول الواضحة للمشكلة:

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return i + (CByte(255) - i) \ CByte(2)
End Function

و

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return CByte(i + (255 - i) \ 2)
End Function

و

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Dim FF As Byte = 255
    Dim two As Byte = 2

    Return i + (FF - i) \ two
End Function

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

هل فاتني بعض الخيار الرابع (الأنيق) الذي يسمح لي بالبايت فقط - الرياضيات دون تشوش في صيغتي مع CBools؟

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

المحلول

يتم ذكرها خصيصا في مواصفات لغة Visual Basic، الفصل 2.4.2:

حاشية. ملاحظة > لا توجد حرف نوع للبيت لأن الشخصية الأكثر طبيعية ستكون ب، وهي شخصية قانونية في حرفي سداسي عشري.

حسنا، هذا صحيح أعتقد. حصلت "الثمانية" صوتت أيضا، بلا شك. استخدم إرجاع CBETE (...)، إنه أرخص من Tobyte ().

نصائح أخرى

ماذا عن استخدام الثوابت:

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
  Const bFF As Byte = 255    
  Const b02 As Byte = 2
  Return i + (bFF - i) \ b02
End Function

لا تحويل، لا صب، لا متغيرات إضافية

ماذا عن الطريقة السهلة:

Imports System.Convert

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return ToByte(i + (255 - i) \ 2)
End Function

تعديل: أفضل هذا الحل السبين لأنه سيفعل الأمر أقل من الصب، ومن الواضح جدا بالنسبة لي ما يحدث.

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