سؤال

مررت عبر هذا و أتساءل عما اذا كان شخص ما يمكن أن يفسر لماذا يعمل هذا في VB.NET عندما كنت تتوقع أن تفشل ، تماما كما يفعل في C#

//The C# Version

struct Person {
    public string name;
}
...
Person someone = null; //Nope! Can't do that!!
Person? someoneElse = null; //No problem, just like expected

ولكن بعد ذلك في VB.NET...

Structure Person
    Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?

هو شيء لا نفس null (لا شيء != null - LOL?), أو أن هذه مجرد طرق مختلفة للتعامل مع الوضع نفسه بين اللغات ؟

لماذا أو ما هو التعامل معها بشكل مختلف بين الاثنين أن يجعل هذا حسنا في واحد ، ولكن ليس غيرها ؟

[تحديث]

بالنظر إلى بعض التعليقات ، لقد عبثت مع هذا أكثر قليلا...يبدو كما لو كنت فعلا لديك لاستخدام Nullable إذا كنت تريد أن تسمح لشيء أن تكون فارغة في VB.NET...لذلك على سبيل المثال...

'This is false - It is still a person'
Dim someone As Person = Nothing
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) 'false'

'This is true - the result is actually nullable now'
Dim someoneElse As Nullable(Of Person) = Nothing
Dim isSomeoneElseNull As Boolean = someoneElse.Equals(Nothing) 'true'

غريب جدا...

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

المحلول

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

نصائح أخرى

Nothing ما يعادل تقريبا default(T) على ذات النوع.(فحص فقط, و هذا صحيح بالنسبة سلاسل وكذلك - أي Nothing هو مرجع فارغة في سياق السلاسل.)

حاولت البحث عنه على MSDN ولكن لا يمكن أن تجد أي شيء ذات الصلة على VB الجانب.عند البحث عن "البنية" في C# ، فإنه من الواضح عوائد أنه نوع قيمة و لا يمكن أن يكون تعيينه لاغيا منذ...انها قيمة.

ومع ذلك ، عند النظر في VB.NET الكلمة "هيكل" أنه لا يقول "نوع القيمة".بدلا من ذلك يقول

هيكل بيان يحدد مركب نوع القيمة التي يمكنك تخصيص.

لذا...الكائن ؟

هذا تخميني.وأود أن يكون إشارات إلى هذا السلوك ولكن لم أستطع العثور على أي.

كما البنيات هي أنواع قيمة (مثل int, char, الخ.) وبالتالي هي غير nullable.

لأن هيكل يتكون من المحتمل عدة أنواع مختلفة (ليست قيمة واحدة لكن ممكن مركب من عدة أنواع مختلفة) ، أن نسأل إذا كان "لا شيء" كسر منطق استخدام "لا شيء".لا شيء الاختبارات بشكل مختلف اعتمادا على نوع أنك الاختبار وبالتالي نوع معقد لا تلتزم منطق استخدام "لا شيء".غير أن لهذا النوع من الاختبارات ، أي بنية وجود كل عنصر الأعضاء في كل منها "لا شيء" القيم نستخدم وظيفة "IsNothing".على سبيل المثال:

Public Class Employees
    Public Structure EmployeeInfoType
       Dim Name As String    ' String
       Dim Age as Integer    ' Integer
       Dim Salary as Single  ' Single
    End Structure

    Private MyEmp as New EmployeeInfoType

    Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean
       If **IsNothing**(Employee) Then
          Return True
       Else
          Return False
       End If
    End Function
End Class
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top