c# مشاريع أثناء تطبيق التعتيم على نموذج ، هل يجب أن نستخدم قيمة عشرية أو مزدوجة؟




مشاريع الفيجوال بيسك جاهزة (11)

بفرض أنك تستخدم WinForms ، فإن Opacity هي من النوع double ، لذلك يجب عليك استخدام:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

ما لم تكن بحاجة إلى القيمة في مكان آخر ، فمن السهل الكتابة:

this.Opacity = trackBar1.Value / 5000.0;

سبب عدم نجاح عنصر التحكم عند تغيير شفرتك إلى مجرد أن تكون مزدوجًا هو أنك:

double trans = trackbar1.Value / 5000;

الذي فسر 5000 كعدد صحيح ، لذلك كانت قيمة trans دائمًا صفرًا. من خلال جعل القيمة الرقمية قيمة نقطة عائمة بشكل صريح بإضافة .0 ، يستطيع المترجم الآن تفسيرها كمزدوج وتنفيذ الحسابات الصحيحة.

أرغب في استخدام شريط المسار لتغيير تعتيم النموذج.

هذه هي شفرتي:

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

عندما أقوم بإنشاء التطبيق ، فإنه يعطي الخطأ التالي:

لا يمكن ضمنيًا تحويل النوع 'decimal' إلى 'double' .

حاولت استخدام trans ولكن بعد ذلك لا يعمل التحكم. عمل هذا الرمز بشكل جيد في مشروع VB.NET سابق.


الحل الأفضل هو:

this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

لديك مشكلتان. أولاً ، تتطلب Opacity قيمة مزدوجة وليست عشرية. يخبرك المترجم أنه في حين أن هناك تحويل بين عشري ومزدوج ، إلا أنه تحويل صريح تحتاج إلى تحديده لكي يعمل. والثاني هو أن TrackBar.Value عبارة عن قيمة عددية وتقسيم int من خلال نتائج int في int بغض النظر عن نوع المتغير الذي تقوم بتعيينه له. في هذه الحالة ، يوجد قالبًا ضمنيًا من int إلى عشري أو مزدوج - نظرًا لعدم وجود فقدان للدقة عند إجراء الإرسال - لذلك لا يشتكي المحول البرمجي ، ولكن القيمة التي تحصل عليها هي 0 دائمًا ، على افتراض ، منذ trackBar.Value دائمًا أقل من 5000. الحل هو تغيير التعليمات البرمجية الخاصة بك لاستخدام مزدوج (نوع أصلي من أجل التعتيم) والقيام بحساب النقطة الحسابية من خلال جعل المضاعف ثابتًا مزدوجًا - والذي سيكون له تأثير في تعزيز الحساب - أو trackBar.Value الصب trackBar.Value إلى مضاعفة ، والتي ستفعل الشيء نفسه - أو كليهما. لا تحتاج إلى المتغير الوسيط ما لم تستخدم في مكان آخر. تخميني هو أن المجمع سيحسنها على أي حال.

trackBar.Opacity = (double)trackBar.Value / 5000.0;

وبما أن Opacity هي قيمة مزدوجة ، فأنا فقط أستخدم ثنائية من البداية ولا أستخدمها على الإطلاق ، ولكن تأكد من استخدام مزدوج عند التقسيم بحيث لا تفقد أي دقة

Opacity = trackBar1.Value / 5000.0;

this.Opacity = trackBar1.Value / 5000d;

تعمل التعليمة البرمجية الخاصة بك بشكل جيد في VB.NET لأنها لا تعمل بشكل ضمني ، بينما تحتوي C # على كل منها ضمني وصريح.

في C # يكون التحويل من العشري إلى المضاعف صريحًا كما تفقد الدقة. على سبيل المثال لا يمكن التعبير عن 1.1 بشكل دقيق كمضاعف ، ولكن يمكن أن يكون عشريًا (انظر " أرقام النقطة العائمة - غير الدقيقة أكثر مما تعتقد " للسبب).

في VB تمت إضافة التحويل من قبل المترجم:

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

يجب ذكر ذلك (double) بشكل صريح في C # ، لكن يمكن أن يتضمنه مترجم VB '' المتسامح ''.


في رأيي ، من المرغوب فيه أن يكون واضحا قدر الإمكان. هذا يضيف الوضوح إلى الشفرة ويساعد زملائك المبرمجين الذين قد يقرؤونه في النهاية.

بالإضافة إلى (أو بدلاً من) إلحاق decimal.ToDouble() إلى الرقم ، يمكنك استخدام decimal.ToDouble() .

وهنا بعض الأمثلة:

// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

يبدو مثل this.Opacity هي قيمة مزدوجة ، و المحول البرمجي لا يعجبك في محاولة وضع قيمة عشرية فيه.


خاصية Opacity هي من النوع المزدوج:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

أو ببساطة:

this.Opacity = trackBar1.Value / 5000.0;

أو:

this.Opacity = trackBar1.Value / 5000d;

لاحظ أنني أستخدم 5000.0 (أو 5000d ) لفرض انقسام مزدوج لأن trackBar1.Value هو عدد صحيح وسيؤدي تقسيمًا صحيحًا وستكون النتيجة عددًا صحيحًا.


لماذا تقسم على 5000؟ فقط قم بتعيين الحد الأدنى والقيم القصوى TrackBar بين 0 و 100 ثم قسمة القيمة على 100 لنسبة Opacity. الحد الأدنى 20 المثال أدناه يمنع النموذج من أن يصبح غير مرئي بالكامل:

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}

إجابة أكثر عمومية للسؤال العام "عشري مقابل مزدوج؟": عشري للحسابات النقدية للحفاظ على الدقة ، مضاعفة للحسابات العلمية التي لا تتأثر بفوارق صغيرة. نظرًا لأن Double هو نوعًا أصليًا في وحدة المعالجة المركزية (يتم تخزين التمثيل الداخلي في الأساس 2 ) ، فإن العمليات الحسابية التي يتم إجراؤها باستخدام Double تؤدي بشكل أفضل عندئذ إلى Decimal (والذي يتم تمثيله في الأساس 10 داخليًا).





opacity