سؤال

في C# هل يمكنني أن أفعل شيئًا كهذا باختصار؟

 bool validName = true;
 if (validName)
 {
     name = "Daniel";
     surname = "Smith";
 }
 else
 {
     MessageBox.Show("Invalid name");
 }

كنت أتساءل فقط عما إذا كان شيء مشابه لهذا سيعمل، ولكن في هذا السيناريو بالضبط، أعلم أنه يمكنك تعيين قيم إذا قمت بذلك name = validName ؟"دانيال" :"غير صالح"، لكنني كنت أتساءل فقط عما إذا كان بإمكاني القيام بما يلي؟

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
هل كانت مفيدة؟

المحلول

إساءة استخدام بناء جملة لامدا واستدلال النوع:

(validName
    ? (Action)
        (() =>
            {
                name = "Daniel";
                surname = "Smith";
            })
      : () =>
           {
                MessageBox.Show("Invalid name");
           })();

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

بناء الجملة غامض بعض الشيء أيضًا.يقوم أولاً بإنشاء اثنين Action الكائنات ثم ?: يختار المشغل بينهما وفي النهاية يتم تنفيذ النتيجة المختارة:

var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

لقد قمت بتجميعها معًا في عبارة واحدة عن طريق تنفيذ الإجراء الناتج في مكانه.ولجعل الأمر أكثر إيجازًا، ألقيت تعبير لامدا الأول في ملف Action (بدلاً من إنشاء ملف new Action() بشكل صريح) والاستفادة من الاستدلال النوعي الذي تركته خارج طاقم الممثلين الثاني.

نصائح أخرى

دعنا نقول أنك يمكن أن تفعل ذلك.لماذا؟

ما هو الدافع؟

خطوط أقل؟لا يكفي لإحداث فرق. أداء؟لا شيء، سوف يتعامل المحول البرمجي مع الأشياء المناسبة لك. وضوح؟إذا كان / آخر أكثر وضوحا ومفهما بسهولة أكبر من قبل غالبية المطورين.

أنا متأكد من ذلك، إذا عملت بجد بما فيه الكفاية، فيمكنك إيجاد طريقة للتعامل مع هذا (على الأرجح kludge)، لكن ما زلت لا أستطيع تحديد السبب.

لا.

المشغل Ternary (؟ :) يجب أن يكون، ككل، تعبير - أي شيء يمكن تعيينه لشيء ما.

يتطلب العامل الشرطي أن تكون معاملاته الثانية والثالثة عبارة عن تعبيرات تُرجع قيمة (بالإضافة إلى استيفاء بعض قيود النوع) وليست عبارات لا تصل إلى قيمة.ليس لديك أي قيمة ترغب في إرجاعها من أي من العمليتين التي تقوم بها حاليًا.

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

giveacodicetagpre.

كما يقول الجميع إنه شيء من المحتمل أنك لن ترغب حقا في فعله، ولكن، فمن الممكن: P

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