العمل مع الحرفيين البايت
-
13-09-2019 - |
سؤال
أنا أستخدم الوظيفة التالية لتفتيح قيم الألوان (إنها 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
د. الشخص الثاني يؤدي العمليات الحسابية في الأعداد الصحيحة ثم يحول النتيجة إلى البايت، وهو ما يرام، ولكن ليس أنيقا كعملية نقية بايت. الحل الثالث لا يتطلب CByte
S، لكن عيوب واضحة.
هل فاتني بعض الخيار الرابع (الأنيق) الذي يسمح لي بالبايت فقط - الرياضيات دون تشوش في صيغتي مع 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
تعديل: أفضل هذا الحل السبين لأنه سيفعل الأمر أقل من الصب، ومن الواضح جدا بالنسبة لي ما يحدث.