C# vs VB.NET - التعامل مع هياكل فارغة
سؤال
مررت عبر هذا و أتساءل عما اذا كان شخص ما يمكن أن يفسر لماذا يعمل هذا في 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