نوع
يُعدّ typeof ، أو typeOf، أو TypeOf، عاملًا مُستخدمًا في العديد من لغات البرمجة لتحديد نوع بيانات المتغير . يُفيد هذا عند إنشاء برامج تتطلب قبول أنواع بياناتمتعددة دون تحديد النوع صراحةً.
في اللغات التي تدعم تعدد الأشكال وتحويل الأنواع ، قد يحمل عامل typeof أحد معنيين مختلفين عند تطبيقه على كائن . في بعض اللغات، مثل Visual Basic ، [ 1 ] يُعيد عامل typeof النوع الديناميكي للكائن. أي أنه يُعيد النوع الأصلي الحقيقي للكائن، بغض النظر عن أي تحويل للأنواع. في هذه اللغات، يُعد عامل typeof هو الطريقة المُستخدمة للحصول على معلومات النوع أثناء التشغيل .
في لغات أخرى، مثل C# [ 2 ] أو D [ 3 ] ، وفي لغة C (ابتداءً من C23 ) [ 4 ] [ 5 ]، يُعيد عامل typeof النوع الثابت للمُعامل. أي أنه يُقيّم إلى النوع المُعلن عنه في تلك اللحظة من البرنامج، بغض النظر عن شكله الأصلي. عادةً ما تحتوي هذه اللغات على بنيات أخرى للحصول على معلومات النوع أثناء التشغيل، مثل typeid .
قد يكون هذا العامل قابلاً للاستخدام كقيمة، مما يوفر تمثيلاً لوقت التشغيل للنوع، أو كنوع بحد ذاته يمكن تطبيقه على قيمة.
أمثلة
ج
اعتبارًا من C23،typeof أصبح جزءًا من معيار C. typeof_unqualأُضيف أيضًا عامل التشغيل ، وهو مماثل لـ typeof، باستثناء أنه يُزيل شرط التحقق من صحة البيانات (cvr) وشرط التحقق الذري (مما يُميزه عن decltypeفي C++). [ 6 ] [ 7 ]
typeofيمكن أن يكون هذا مفيدًا لربط المتغيرات ذات الأنواع غير المعروفة في وحدات الماكرو. في هذا المثال، maxيجب استخدام متغيرات مؤقتة لتجنب تقييم المدخلات عدة مرات، ويتم استخدام `this` typeofلتحديد نوع هذه المتغيرات المؤقتة. تجدر الإشارة إلى أن هذا المثال يستخدم امتدادًا غير قياسي للغة C ، وهو استخدام العبارات المركبة كتعابير (مدعومة، على سبيل المثال، بواسطة GNU GCC [ 8 ] ).
#define max(a, b) ({ \ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; \ })لغة سي++
توفر لغة C++ المعاملين ` decltypeand` typeid. [ 9 ] [ 10 ]decltype ، كما هو الحال في لغة C typeof، يُستخدم `and` لاختصار الأنواع ولإعطاء أنواع للمتغيرات التي تعتمد على نوع المتغيرات العامة، والتي يكون نوعها غير معروف (مثلًا في القوالب أو وحدات الماكرو). typeidيوفر `and` تمثيلًا لنوع المتغيرات في وقت التشغيل للتوزيع الديناميكي .
struct Double { double value ; }const Double * d ;// يمكن استخدام decltype في تعريفات الأنواع decltype ( d -> value ) y ; // مكافئ لـ double y;// يمكن استخدام decltype في أنواع الإرجاع اللاحقة // قد يكون هذا ضروريًا للمعاملات المُحمّلة بشكل زائد، حيث، على سبيل المثال، // قد ينتج عن النوع T + النوع U النوع V مختلفًا عن T و U template < typename T , typename U > auto add ( T t , U u ) -> decltype ( t + u ) { return t + u ; }يمكن أيضًا استخدام عامل ^^الانعكاس ، الذي تم تقديمه في C++26 ، للحصول على تمثيل لنوع ما كقيمة. [ 11 ]
استيراد std ؛باستخدام std :: string ؛ باستخدام std :: meta :: info ؛struct User { string name ; int age ; };int main () { constexpr info stringClass = ^^ string ;constexpr User john { . name = "John Doe" , . age = 20 }; std :: println ( "The class of {} is {}" , john . name , std :: meta :: identifier_of ( ^^ User )); }سي شارب
في لغة C# ، System.Object.GetType()تُعيد الدالة System.Typeقيمةً تُمثل نوع القيمة في وقت التشغيل. [ 12 ] أما المعامل، typeofفيُقدم تمثيلًا لنوع القيمة في وقت التشغيل، ولا يُحدد نوع القيمة. [ 13 ]
// عند إعطاء كائن، تُرجع هذه الدالة ما إذا كان عددًا صحيحًا أم لا. // يمكن أيضًا استخدام عامل التشغيل "is" لتحديد ذلك. public static bool IsInteger ( object o ) { return o . GetType () == typeof ( int ); }جافا
java.lang.Objectيمكن استخدام طريقة 's getClass()لإرجاع فئة أي كائن، والتي تكون دائمًا نسخة من تلك java.lang.Classالفئة. [ 14 ] يمكن تحويل جميع الأنواع إلى قيمة تمثيل وقت التشغيل عن طريق إضافة " .class". على الرغم من الاسم، فإن هذا ممكن حتى لو لم تكن فئات، مثل الأنواع الأولية ( int.class) أو المصفوفات ( String[].class).
String s = "Hello, world!" ; Class <?> sClass = s . getClass ();Class <String> stringClass = String.class ; Class <Integer> intClass = int.class ;Object obj = /* شيء ما هنا */ ; System . out . printf ( "صنف %s هو %s%n" , obj , obj . getClass (). getName ());جافا سكريبت
تُعيد الدالة typeofفي جافا سكريبت سلسلة نصية تمثل النوع الأساسي لوقت التشغيل للقيمة. [ 15 ]
دالة isNumber ( n ) { return typeof n === 'number' ; }تايب سكريبت
يقوم TypeScript بتوسيع عامل JavaScript typeof، مما يسمح باستخدامه في نوع قيمة أخرى، مما يمثل النوع الثابت للقيمة.
دالة someFunction ( معامل : نوع الكائن الموجود ) : لا شيء { // ... }let newObject : typeof existingObject ;بايثون
تحتوي لغة بايثون على الدالة المدمجة type. [ 16 ]
print ( type ( 123 )) # يطبع: <class 'int'>VB.NET
في لغة VB.NET ، يجب ترجمة صيغة C# للكلمة المفتاحية "typeof" إلى دالة GetType في VB.NET . تُستخدم الكلمة المفتاحية TypeOf في VB.NET لمقارنة متغير مرجعي لكائن بنوع بيانات.
يستخدم المثال التالي تعبيرات TypeOf...Is لاختبار توافق نوع متغيري مرجع الكائن مع أنواع البيانات المختلفة.
Dim refInteger As Object = 2MsgBox ( "هل نوع الكائن [Integer] عدد صحيح؟ " & نوع المرجع refInteger عدد صحيح ) MsgBox ( "هل نوع الكائن [Integer] عدد عشري؟ " & نوع المرجع refInteger عدد عشري )Dim refForm As Object = New System.Windows.Forms.FormMsgBox ( " هل نوع الكائن [Form] هو نموذج؟" & TypeOf refForm هو System.Windows.Forms.Form ) MsgBox ( " هل نوع الكائن [Form] هو تسمية؟" & TypeOf refForm هو System.Windows.Forms.Label ) MsgBox ( " هل نوع الكائن [ Form ] هو عنصر تحكم ؟" & TypeOf refForm هو System.Windows.Forms.Control ) MsgBox ( " هل نوع الكائن [ Form ] هو مكون IComponent ؟ " & TypeOf refForm هو System.ComponentModel.IComponent )انظر أيضاً
مراجع
- ↑ "عامل TypeOf (فيجوال بيسك)" . MSDN . مؤرشف من الأصل في 28 نوفمبر 2016.
- ↑ "typeof (C#)" . MSDN . مؤرشف من الأصل في 10 سبتمبر 2016.
- ↑ "التصريحات - لغة البرمجة D 1.0" . ديجيتال مارس . 30 ديسمبر 2012. مؤرشف من الأصل في 7 أكتوبر 2023.
- ↑ " Typeof " في "استخدام مجموعة مترجمات GNU".
- ↑ مينيد، جان هيد (2021-03-07). "ليس سحريًا تمامًا - typeof(...) في لغة C | r2" . المعايير المفتوحة . تم الاسترجاع في 2021-12-02 .
- ↑ "N2927: ليس سحريًا تمامًا - typeof للغة C" . المعايير المفتوحة . 2022-02-02. مؤرشف من الأصل في 1 ديسمبر 2023.
- ↑ "النظر في إعادة تسمية remove_quals" (ملف PDF) . المعايير المفتوحة . 2022-02-06. مؤرشف (ملف PDF) من الأصل في 17 فبراير 2024.
- ↑ "تعبيرات العبارات (باستخدام مجموعة مترجمات جنو (GCC))" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 10-05-2026 .
- ↑ "محدد نوع الإعلان" . cppreference.com . 22 أبريل 2026. تم الاطلاع عليه في 10 مايو 2026 .
{{cite web}}: CS1 maint: url-status ( link ) - ↑ "معامل typeid" . cppreference.com . 13 أغسطس 2024. تم الاطلاع عليه في 10 مايو 2026 .
{{cite web}}: CS1 maint: url-status ( link ) - ↑ وايت تشيلدرز وآخرون (26 يونيو 2024). "P2996R4 - الانعكاس لـ C++26" . isocpp.org . WG21.
- ↑ مايكروسوفت ليرن. "طريقة Object.GetType" . learn.microsoft.com . مايكروسوفت ليرن . تم الاطلاع عليه بتاريخ 21 أبريل 2026 .
- ↑ "اختبار أنواع المعاملات وتعبيرات التحويل لاختبار نوع الكائن في وقت التشغيل - مرجع C#" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 10 مايو 2026 .
- ↑ شركة أوراكل (21 أبريل 2026). "كائن الفئة" . docs.oracle.com . وثائق جافا إس إي.
- ↑ "typeof - JavaScript | MDN" . وثائق MDN على الويب . 2026-01-08 . تم الاطلاع عليه بتاريخ 2026-05-10 .
- ↑ "الدوال المدمجة" . وثائق بايثون . تم الاطلاع عليه بتاريخ 20 يونيو 2025 .
- المشغلون (البرمجة)
