سؤال

لقد كنت أبحث في الكثير من المنشورات/المقالات حول استخدام Iif().بدأ كل هذا عندما حاولت استخدام IIf() مثل عامل شرطي كثيرًا مثل C/C#/C++ وما إلى ذلك.

ما حاولت فعله بالضبط كان بالضبط في سطور هذا المنشور التالي:

باستخدام VB.NET IIF أحصل على NullReferenceException

ومع ذلك، تم استعارة الحل الذي قمت بتنفيذه من موقع msdn التالي:

http://msdn.microsoft.com/en-us/library/27ydhh0d%28v=vs.80%29.aspx

بعد ذلك فقط تعلمت عن طريقة If() في vb.net.

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

Function ReturnValue(ByVal MyType As SomeType, ByVal PropertyName as String) As Object
    If MyType Is Nothing Then Return String.Empty
    Dim arrPropInfo As PropertyInfo() = MyType.GetType().GetProperties()
    Return arrPropInfo.Where(Function(x) x.Name = PropertyName).Item(0).GetValue(MyType, Nothing)
End Function

سؤالي هو، هل هناك شيء مكتوب داخل Iif() لإلقاء خطأ كهذا؟- NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()

أم أن هناك شيئًا أكبر بكثير في العمل هنا؟لذا لنفترض أنني إذا أردت كتابة دالة مثل iif، والتي ستؤدي إلى حدوث خطأ إذا كان هناك شيء ما في قائمة الوسائط فارغًا، فهل الطريقة المذكورة أعلاه هي الطريقة الوحيدة للقيام بذلك؟

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

المحلول

الفرق هو ذلك ?: و If() نكون العاملين. IIf() ليس عاملاً؛إنها وظيفة قديمة واضحة.يمكنك حتى تنفيذ ذلك بنفسك:

Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object
    If Expression Then Return TruePart Else Return FalsePart
End Function

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

تحتاج أيضًا إلى ملاحظة أنه من المقبول تمامًا تمرير null/Nothing إلى دالة.لقد رأيت الاستثناء في التعليمات البرمجية الخاصة بك لأن التعبير الذي كنت تمرره يحتوي على مرجع فارغ لا يمكن تقييمه - على سبيل المثال، إذا فعلت شيئًا مثل حاول استخدام خاصية .Length لمتغير سلسلة فارغة.

من ناحية أخرى، لا يواجه عامل التشغيل If() هذه المشكلة لأنه:علاوة على ذلك، فهو عامل يستفيد من تقييم الدائرة القصيرة، بحيث يحتاج فقط إلى تقييم التعبير المرتجع.يتمتع If() أيضًا بميزة رائعة تتمثل في كونه آمنًا من النوع، على الرغم من أنه يمكنك تكرار أمان النوع في وظيفة IIF(Of T)() العامة أيضًا، إذا أردت ذلك.

نصائح أخرى

IIF يختلف عن C++ :؟بطريقة واحدة مهمة على الأقل، يقوم دائمًا بتقييم كلا التعبيرين بحيث لا يمكنك القيام بأشياء مثل IIF(X is nothing,DefaultValue,X.Value).سيتم طرح استثناء مرجعي فارغ لأنه في حالة أن X لا شيء، فإنه سيستمر في تقييم X.Value.

تعمل IIF بالطريقة التي تعمل بها لأنها دالة وليست عامل تشغيل

لم تقدم رمزًا لكيفية استخدامك لـ IIF لذا فأنا أخمن فقط.ما قلته للتو هو التعليق الأول من الرابط الذي قدمته إلى MSDN، لذا فمن المحتمل أنك تعرف هذا بالفعل أو أن هذا ليس سؤالك.

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

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

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