سؤال

دفعتني مناقشة في وقت سابق اليوم إلى التساؤل عما إذا كان فهمي للمبتسمترات والحرفية صحيحًا أم لا.


أفهم أن النوع الحرفي هو على وجه التحديد نوعًا يمكن أن يكون له قيمة باستخدام تدوين يمكن لكل من الإنسان والمترجم أن يفهمه دون إعلانات نوع محددة:

var firstName = "John"; // "John" is literal

var firstName = (string)"John"; // *if* the compiler didn't understand that "John"
                                // was a literal representation of a string then I
                                // would have to direct it as such

إن فهمي للأوائد البدائية هو أنها في الأساس أنواع البيانات الأولية التي يمكن للمترجم فهمها ، مثل int:

int age = 25;

... يمكن أن يكون الحرفي غير متوقع ، مثل دعم VB9 للحرفية XML. سيكون مثال العالم غير الحقيقي إذا كان يمكن تعيين System.drawing.point مع الحرفيين:

Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
                       // composite value comprised of two primitive values

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

على سبيل المثال System.String هو نوع مرجعي يدعم الحرفية. الهياكل المحددة حسب الطلب هي أنواع القيمة المركبة التي لا تدعم الحرفية.

هل فهمي (إن لم يكن توضيحي) صحيح في معظمه؟


تحديث: شكرا على المعلومات والمحادثات الرائعة! لأي شخص يجد هذا ، تأكد من قراءة التعليقات وكذلك الإجابات ، هناك بعض التوضيحات الرائعة التي تنتشر حولها بالإضافة إلى بعض الحالات الجانبية المثيرة للاهتمام.

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

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

المحلول

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

على الرغم من أن الكائنات نفسها تحتوي على بدائيات هناك تخزين توجد مكان تخصيص الكائن الفعلي ، وهو على الكومة.

بخلاف ذلك ، فإن بيانك مكتوب بشكل جيد. هل لديك سؤال محدد فاتني :)؟

نصائح أخرى

أردت فقط حقن ملاحظة سريعة هنا.

تحدد مواصفات لغة C# بوضوح "الحرفي" - الحرفي هو أ تمثيل رمز المصدر لقيمة. الحرفية مثل أشياء مثل true, 10, 5.7, 'c', "hello" و NULL - هم نص وهذا يمثل قيمة محددة.

تستخدم مواصفات لغة C# كلمة "بدائية" مرتين ؛ لا يتم تعريفه أبدًا وغامضة تمامًا لما يمكن أن يعنيه.

لا تحتاج مواصفات لغة C# إلى استخدام أو تحديد كلمة "بدائية" وبالتالي لا ينبغي أن تستفيد من هذا المصطلح الغامض. لقد تحدثت مع Mads ووافقنا على أن الإصدارات المستقبلية من المواصفات سيتم إعادة صياغتها للقضاء على هذا الاستخدام تمامًا.

كيف تحدد مواصفات أنظمة النوع الأخرى - مكتبة الانعكاس ، CLI ، VES ، وما إلى ذلك - كلمة "البدائية" بالطبع.

شكرا لطرح السؤال.

هل فهمي (إن لم يكن توضيحي) صحيح في معظمه؟

لا أتفق في نقطة واحدة: الحرفي هو نوع من وقت الترجمة ثابت (مثل "Hello World", 5 أو 'A'). ومع ذلك ، لا توجد "أنواع حرفية" ؛ الحرفي دائمًا هو القيمة الفعلية.

الأنواع البدائية هي الأنواع "الأساسية" IMO مثل String ، Int ، Double ، Float ، Short ، ...

البدائية لذلك لديهم أنواعهم من الحرفيات المرتبطة بهم.

نعم ، الحرفية هي قيمة معبر عنها في رمز المصدر - لذلك في حين يدعم VB التاريخ/الوقت و XML الحرفيين ، فإن C# لا.

من C# Spec ، القسم 2.4.4:

أ حرفي هو تمثيل رمز المصدر لقيمة.

كما تقول ، هذا لا علاقة له بنوع القيمة مقابل نوع المرجع - السلسلة هي في الواقع نوع مرجع.

حرفي واحد لم يذكره أحد بعد null على فكرة...

كما أنه غير مرتبط بالأنواع البدائية - من Type.IsPrimitive:

الأنواع البدائية هي منطقية ، بايت ، sbyte ، int16 ، uint16 ، int32 ، uint32 ، int64 ، uint64 ، intptr ، uintptr ، char ، double ، و single.

... لا تحدد مواصفات C# فكرة النوع "البدائي" ، ولكن لاحظ ذلك String ليس في القائمة أعلاه.

فيما يتعلق بالحرفية التي يتم تجميع ثوابت الوقت ... في C# كل حرفي له تمثيل يمكن أن يخبز مباشرة في التجمع ؛ تعني الحرفية الإضافية في VB أنها ليست ثوابت لأن CLR ستفهمها - لا يمكن أن يكون لديك const DateTime على سبيل المثال - لكنهم ما زالوا حرفيين.

هنا هي صفحة MSDN ، تتحدث عن CLS ، تتضمن سلسلة كنوع بدائية:

تتضمن مكتبة فئة .NET Framework أنواعًا تتوافق مع أنواع البيانات البدائية التي يستخدمها المجمعون. من هذه الأنواع ، ما يلي متوافق مع CLS: BYTE ، INT16 ، INT32 ، INT64 ، واحد ، مزدوج ، منطقي ، char ، العشرية ، intptr ، والسلسلة. لمزيد من المعلومات حول هذه الأنواع ، راجع جدول الأنواع في .NET Framework Class Library Library.

لا تنسى هناك أيضًا ASP.NET الفئة الحرفية.

تحرير: وهكذا ، فإن إجابة على السؤال في العنوان هي لا ، حيث لا يوجد فئة "بدائية" توفر نفس الوظيفة. يمكن اعتبار ذلك جزءًا من استجابة ALEC الذكية.

أعتقد أن فهمك صحيح في الغالب. كما قال WinSharp93 ، فإن الحرفيين هي قيم لها أنواعها ، ولكن لا يوجد شيء مثل "النوع الحرفي". هذا هو ، على الرغم من أنه يمكنك الحصول على حرفي سلسلة ، فإن الأوتار ليست "نوعًا حرفيًا". كما خمنت ، فإن ما يحدد الحرفي هو أن القيمة تتم شطبها مباشرة في الكود المصدري ، على الرغم من أن متطلباتك بعدم تحديد أي نوع يبدو صارمًا بشكل مفرط (على سبيل المثال ، يحتوي على حرفي صفيف ، ويمكنه استنتاج نوع الصفيف الحرفي [| 1; 2; 3 |], ، ولكن لا يمكن بالضرورة استنتاج نوع الصفيف الفارغ الحرفي [| |]).

لسوء الحظ ، لا أعتقد أن هناك تعريفًا جيدًا لما يجعل بدائية. بالتأكيد ، كما يشير Jon Skeet ، فإن CLR لديه تعريفه الخاص للبدلة (Type.IsPrimitive) ، والتي تستبعد السلاسل. لكن، مصادر أخرى ذات سمعة طيبة انصح string وحتى object لتكون أنواع بدائية داخل ج#. أفضل هذا التعريف ، نظرًا لوجود دعم مدمج في C# للسلاسل ، مثل استخدام + مشغل للتسلسل واستخدام == كمساواة قيمة بدلاً من المساواة المرجعية ، وكذلك حقيقة أنه يمكن إحالة نوع السلسلة إلى استخدام النموذج القصير string بدلا من الاضطرار إلى استخدام الاسم الكامل System.String.

فقط لإضافة أن هناك نوعًا آخر يطمس الحد: System.Decimal يمكن التعبير عن قيمه كـ الحرفية في ال ج# اللغة ، ولكنها ليست ملف .NET النوع البدائي.

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

في الواقع .NET عشرية نكون "محاكاة"من خلال وقت التشغيل .NET ولا يتم التعامل معه مباشرة بواسطة الأجهزة التي تفهمها فقط IEEE 754 أرقام النقاط العائمة (تعويم وتضاعف الأنواع البدائية).

بامتداد فكرة القيم الحرفية "الأنواع الحرفية" يمكن اعتباره أي نوع يمكن التعبير عنه مباشرة في لغة معينة (C#، VB.NET ، CIL ...). مع هذا التعريف ستكون الأنواع الحرفية: جميع الأنواع البدائية + سلاسل + عشرية.

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