سؤال

في Visual Basic, هل هناك الفارق في الأداء عند استخدام IIf وظيفة بدلا من If البيان ؟

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

المحلول

VB التالية If البيان الذي يشير السؤال إلى:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

الأول هو الأساس C#'s الثلاثي المشروط المشغل الثاني هو تتجمع المشغل (عودة result إلا إذا كان Nothing, في هذه الحالة العودة "Alternative"). If وبالتالي استبدال IIf و هذا الأخير هو عفا عليها الزمن.

في مثل C#, VB المشروط If مشغل قصيرة الدوائر ، بحيث يمكنك الآن بأمان الكتابة التالية ، والتي ليس من الممكن استخدام IIf وظيفة:

Dim len = If(text Is Nothing, 0, text.Length)

نصائح أخرى

IIf() يعمل كل الصواب والخطأ رمز.عن أشياء بسيطة مثل رقمية مهمة ، هذه ليست صفقة كبيرة.ولكن البرمجية التي يتطلب أي نوع من المعالجة, أنت تضيع دورات تشغيل شرط أن لا يطابق ، وربما التسبب في آثار جانبية.

رمز التوضيح:

Module Module1
    Sub Main()
        Dim test As Boolean = False
        Dim result As String = IIf(test, Foo(), Bar())
    End Sub

    Public Function Foo() As String
        Console.WriteLine("Foo!")
        Return "Foo"
    End Function

    Public Function Bar() As String
        Console.WriteLine("Bar!")
        Return "Bar"
    End Function
End Module

النواتج:

Foo!
Bar!

أيضا قضية أخرى كبيرة مع معهد التمويل الدولي هو أن استدعاء أي وظائف في الحجج [1] حتى إذا كان لديك حالة كما يلي:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

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

[1] الدالة IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(مقابل.71).aspx

استخدام أفضل إذا بدلا من معهد التمويل الدولي إلى استخدام نوع الاستدلال آلية بشكل صحيح (الخيار الاستدلال على)

في هذا المثال, الكلمات الرئيسية المعترف بها كسلسلة عند استخدام إذا :

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

وإلا فمن المسلم به ككائن :

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)

وفقا هذا الرجل, IIf يمكن أن تصل إلى 6x طالما إذا/إذن.YMMV.

علاوة على أن القراءة يجب أن تكون على الأرجح أكثر يفضل درجة عالية من الأداء في هذه الحالة.حتى لو IIF كان أكثر كفاءة انها مجرد أقل للقراءة إلى الجمهور المستهدف (أفترض إذا كنت تعمل في Visual Basic تريد مبرمجين آخرين أن تكون قادرا على قراءة التعليمات البرمجية الخاصة بك بسهولة ، الذي هو VB أكبر نعمة...والتي فقدت مع مفاهيم مثل IIF في رأيي).

أيضا ، "IIF هي وظيفة مقابل إذا كان جزءا من اللغات والنحو"...وهو ما يعني لي أن, في الواقع, إذا سيكون أسرع...إذا كان أي شيء آخر من هذا البيان إذا يمكن أن يكون المغلي مباشرة إلى مجموعة صغيرة من opcodes بدلا من الاضطرار إلى الذهاب إلى مكان آخر في الذاكرة لأداء المنطق وجدت في وظيفة.انها مبتذلة الفرق ، ربما ، ولكن الجدير بالذكر.

أعتقد أن الفرق الرئيسي بين إذا IIf هو:

  • إذا(اختبار [منطقي], statement1, statement2) وهذا يعني أنه وفقا قيمة الاختبار إما satement1 أو statement2 سوف يعدم (ببيان واحد فقط سيتم تنفيذ)

  • خافت obj = IIF(اختبار [منطقي] , statement1, statement2) فهذا يعني أن كل البيانات سيتم تنفيذ ولكن وفقا قيمة اختبار واحد منهم سيعود قيمة (الكائنات).

حتى إذا كان واحد من البيانات سوف رمي استثناء وسوف رميها في (IIf) على أي حال ولكن في (إذا) أنها سوف رمي في الحالة العودة قيمته.

...لماذا يمكن أن يستغرق ما دام 6x, التقدير: ويكي:

لأن IIf هو وظيفة المكتبة ، سوف تتطلب دائما النفقات العامة وظيفة الاتصال ، في حين أن المشروط المشغل أكثر من المرجح أن تنتج مضمنة رمز.

أساسا IIf هو ما يعادل مشغل الثلاثي في C++/C#, حيث أنه يعطي لك بعض 1 خط إذا/آخر نوع البيانات إذا كنت ترغب في ذلك.يمكنك أيضا إعطاء وظيفة تقييم إذا كنت ترغب.

هذه الوظائف هي مختلفة!ربما تحتاج فقط إلى استخدام إذا كان البيان.IIF سوف يكون دائما أبطأ لأنها سوف تفعل كل الوظائف بالإضافة إلى أنها سوف تفعل القياسية إذا كان البيان.

إذا كنت أتساءل لماذا هناك IIF وظيفة ، ربما سيكون هذا التفسير:

Sub main()
    counter = 0
    bln = True
    s = iif(bln, f1, f2)
End Sub

Function f1 As String
    counter = counter + 1
    Return "YES"
End Function

Function f2 As String
    counter = counter + 1
    Return "NO"
End Function

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

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