سؤال

هذا سؤال حول لغة VB.NET.وبما أنني أستخدمه كل يوم، أحاول فقط أن أفهم الدوافع وراء بعض بنياته.

لقد اكتشفت للتو أن هذا السطر:

If myObject Is Nothing then

صحيح مثل هذا هو:

If Nothing Is myObject Then

نفس النتائج.باستخدام ildasm، يمكننا أن نرى أن هذه السطور تمت ترجمتها إلى:

if myObject = null then

و

if null = myObject then

حسنًا، لكن في VB.NET، لا يمكنك كتابة:

if myObject = Nothing Then

لن يقبل المترجم ذلك.

مم، بالنسبة لي، إذا لم يكن هناك شيء هو myObject هو أقل وضوحا بكثير من إذا كان myObject = لا شيء.

لماذا يعتقد مؤلفو VB.NET العكس؟أي تلميح؟

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

المحلول

المشكلة التي تواجهها هي أن VB.Net يميز بين نوعي مقارنة الكائنات.وهي المقارنة المرجعية والقيمة.

يتم استخدام عامل التشغيل "Is" في VB.Net للمقارنة المرجعية.يمكن استخدام هذا عندما تكون القيم المعنية عبارة عن أنواع مرجعية أو قيم فارغة.ستؤدي محاولة مقارنة أنواع القيم بهذه الطريقة إلى حدوث خطأ في الترجمة.

يتم استخدام عامل التشغيل "=" لمقارنة القيمة.لا يمكن استخدام مقارنة القيمة إلا على الأنواع التي تحدد زوج عامل التشغيل =، <> الصريح في تعريف فئتها.التنفيذ الفعلي للمساواة يعتمد على تنفيذ المشغل.

تتخذ لغة C# أسلوبًا مختلفًا من حيث أنها تستخدم == لمقارنة القيمة والمرجع.ويعتمد ما يتم استخدامه على عدة عوامل بما في ذلك نوع القيم التي تتم مقارنتها وتنفيذ طرق مساواة معينة.

نصائح أخرى

إنها واحدة من هذه الأشياء الموروثة من VB6 وCOM.يميز VB6 بين كائنات النوع المرجعي (القابلة للإنشاء الفوري) والأنواع الأصلية مثل int.يجب إنشاء أنواع المراجع وتعيينها باستخدام عامل التشغيل "Set" بينما تستخدم الأنواع الأصلية ببساطة "=".

حسنا، في بعض الحالات يمكنك الكتابة If myObject = Nothing Then, ، لكنها لن تكون مقارنة فارغة:

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

الكود أعلاه يعادل ما يلي:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

في هذه الحالة، يكون لديك نوع قيمة له قيمته "emtpy" (0 لـ an Integer, Point.Empty ل Point البنية كأمثلة).يقوم عامل التشغيل Is بإجراء المقارنة المرجعية (التحقق مما إذا كانت الكائنات المقارنة هي نفس المثيل)، في حين أن علامة المساواة هي أ مقارنة القيمة.

فكرة أخرى هي أن لغة VB تهدف إلى أن تكون أكثر تفصيلاً إذا نظرت إلى بعض صيغ الحلقة والجمل الشرطية.بعض الأمثلة:

فب:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

ج#

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

هل ترى كل الكلمات الإضافية في كود VB.Net؟وهذا سبب آخر محتمل لهذا الاختلاف.

استخدام Is Nothing هو بناء يعود إلى أيام Visual Basic الكلاسيكية (أي.6.0 وما دون).

للحفاظ على بعض مظاهر التوافق (تمامًا مثل الطريقة التي يتعامل بها VB6 مع التقييم غير البطيء لملف If بيان) تم نقل هذا إلى VB.NET.

ولحسن الحظ كما ocdecio يشير إلى أنه كانت هناك بيكاديللو أخرى مماثلة لم يتم ترحيلها إلى VB.NET مثل Set بيان لتعيين الكائنات إلى المتغيرات.

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