تمرين - استكشاف تحويل نوع البيانات وتحويلها
- 30 دقائق
هناك تقنيات متعددة لإجراء تحويل نوع البيانات. تعتمد التقنية التي تختارها على إجابتك على سؤالين مهمين:
- هل من الممكن، اعتمادا على القيمة، أن تؤدي محاولة تغيير نوع بيانات القيمة إلى طرح استثناء في وقت التشغيل؟
- هل من الممكن، اعتمادا على القيمة، أن تؤدي محاولة تغيير نوع بيانات القيمة إلى فقدان المعلومات؟
في هذا التمرين، يمكنك العمل في طريقك من خلال هذه الأسئلة، والآثار المترتبة على إجاباتها، والتقنية التي يجب عليك استخدامها عندما تحتاج إلى تغيير نوع البيانات.
إعداد بيئة الترميز الخاصة بك
تتضمن هذه الوحدة أنشطة عملية ترشدك خلال عملية إنشاء التعليمات البرمجية التوضيحية وتشغيلها. يتم تشجيعك على إكمال هذه الأنشطة باستخدام Visual Studio Code كبيئة تطوير. يساعدك استخدام Visual Studio Code لهذه الأنشطة على أن تصبح أكثر راحة في الكتابة وتشغيل التعليمات البرمجية في بيئة مطور يستخدمها المحترفون في جميع أنحاء العالم.
إشعار
إذا كنت قد أكملت وحدات Microsoft Learn النمطية الأخرى في سلسلة C# هذه، فربما تكون قد أنشأت بالفعل مجلد مشروع لعينات التعليمات البرمجية. إذا كان الأمر كذلك، يمكنك تخطي القسم التالي من الخطوات، وحذف التعليمات البرمجية Program.cs في الملف المستخدم في تمرين سابق.
إشعار
تم تصميم نماذج التعليمات البرمجية في هذا التمرين استنادا إلى إعدادات الثقافة في الولايات المتحدة، وتستخدم نقطة (.) كفاصل عشري. قد يؤدي إنشاء التعليمات البرمجية وتشغيلها باستخدام إعداد ثقافة يستخدم فواصل عشرية مختلفة (مثل الفاصلة ,) إلى نتائج أو أخطاء غير متوقعة. لإصلاح هذه المشكلة، استبدل فواصل الفاصلة العشرية في نماذج التعليمات البرمجية بالفاصل العشري المحلي (مثل ,).
بدلا من ذلك، لتشغيل برنامج باستخدام إعداد الثقافة en-US، أضف التعليمات البرمجية التالية إلى أعلى البرنامج الخاص بك: using System.Globalization; وبعد إضافة usingأي عبارات أخرىCultureInfo.CurrentCulture = new CultureInfo("en-US");.
فتح Visual Studio Code.
يمكنك استخدام القائمة Windows (أو مورد مكافئ لنظام تشغيل آخر) لفتح Visual Studio Code.
في قائمة Visual Studio Code File ، حدد Open Folder.
في مربع الحوار فتح مجلد ، انتقل إلى مجلد سطح مكتب Windows.
إذا كان لديك موقع مجلد مختلف حيث تحتفظ بمشاريع التعليمات البرمجية، يمكنك استخدام موقع المجلد هذا بدلا من ذلك. لهذا التدريب، الشيء المهم هو أن يكون لديك موقع يسهل تحديد موقعه وتذكره.
في مربع الحوار فتح مجلد ، حدد تحديد مجلد.
إذا رأيت مربع حوار أمان يسألك عما إذا كنت تثق بالمؤلفين، فحدد نعم.
في قائمة Visual Studio Code Terminal ، حدد New Terminal.
لاحظ أن موجه الأوامر في لوحة Terminal يعرض مسار المجلد للمجلد الحالي. على سبيل المثال:
C:\Users\someuser\Desktop>لإنشاء تطبيق وحدة تحكم جديد في مجلد محدد، في نوع موجه الأوامر Terminal:
dotnet new console -o ./CsharpProjects/TestProjectثم اضغط على Enter.يستخدم أمر .NET CLI هذا قالب برنامج .NET لإنشاء مشروع تطبيق وحدة تحكم C# جديد في موقع المجلد المحدد. ينشئ الأمر مجلدات CsharpProjects وTestProject نيابة عنك، ويستخدم TestProject كاسم للملف
.csproj.في لوحة EXPLORER، قم بتوسيع المجلد CsharpProjects .
يجب أن تشاهد مجلد TestProject وملفين، ملف برنامج C# المسمى Program.cs وملف مشروع C# يسمى TestProject.csproj.
في لوحة EXPLORER، لعرض ملف التعليمات البرمجية في لوحة المحرر، حدد Program.cs.
حذف أسطر التعليمات البرمجية الموجودة.
يمكنك استخدام مشروع وحدة تحكم C# هذا لإنشاء نماذج التعليمات البرمجية وبنائها وتشغيلها أثناء هذه الوحدة النمطية.
أغلق لوحة Terminal.
السؤال: هل من الممكن أن تؤدي محاولة تغيير نوع بيانات القيمة إلى طرح استثناء في وقت التشغيل؟
يحاول المحول البرمجي C# استيعاب التعليمات البرمجية الخاصة بك، ولكنه لا يقوم بتجميع العمليات التي قد تؤدي إلى استثناء. عندما تفهم الشاغل الأساسي للمحول البرمجي C#، يكون فهم سبب عمله بطريقة معينة أسهل.
كتابة التعليمات البرمجية التي تحاول إضافة int و string وحفظ النتيجة في int
تأكد من فتح Visual Studio Code وعرضه Program.cs في لوحة المحرر.
إشعار
يجب أن يكون Program.cs فارغا. إذا لم يكن كذلك، فحدد كافة أسطر التعليمات البرمجية واحذفها.
اكتب التعليمات البرمجية التالية في محرر Visual Studio Code:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);هنا، تحاول إضافة القيم
2و4. القيمة4هي من النوعstring. هل سينجح هذا؟في قائمة Visual Studio Code File ، حدد Save.
يجب حفظ ملف Program.cs قبل إنشاء التعليمات البرمجية أو تشغيلها.
في لوحة EXPLORER، لفتح Terminal في موقع مجلد TestProject، انقر بزر الماوس الأيمن فوق TestProject، ثم حدد Open in Integrated Terminal.
يجب فتح لوحة Terminal، ويجب أن تتضمن موجه أوامر يظهر أن Terminal مفتوحة لموقع مجلد TestProject.
في موجه الأوامر Terminal، لتشغيل التعليمات البرمجية، اكتب
dotnet runثم اضغط على Enter.يجب أن تشاهد الإخراج التقريبي التالي
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'إشعار
إذا رأيت رسالة تقول "تعذر العثور على مشروع لتشغيله"، فتأكد من أن موجه الأوامر Terminal يعرض موقع مجلد TestProject المتوقع. على سبيل المثال:
C:\Users\someuser\Desktop\csharpprojects\TestProject>خذ دقيقة للنظر في سبب عدم تمكن المحول البرمجي من تشغيل نموذج التعليمات البرمجية الأول.
يخبرك الجزء المهم من رسالة الخطأ،
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'أن المشكلة في استخدامstringنوع البيانات.ولكن لماذا لا يمكن للمحول البرمجي C# التعامل مع الخطأ فقط؟ بعد كل شيء، يمكنك القيام بالعكس لسلسلة رقم إلى
stringوحفظه في متغير سلسلة. هنا، يمكنك تغيير نوع بيانات المتغير منresultintإلىstring.تحديث التعليمات البرمجية الخاصة بك في محرر التعليمات البرمجية Visual Studio كما يلي:
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
يجب عليك مراقبة الإخراج التالي:
24الإخراج غير صحيح رياضيا ولكنه يكتمل عن طريق دمج القيم كحرفين "2" و"4".
افحص، مرة أخرى، مثال التعليمات البرمجية الأول حيث
resultيكون المتغير من النوعint. التعليمات البرمجية مع رسالة الخطأ.int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);لماذا لا يمكن للمحول البرمجي C# معرفة أنك تريد التعامل مع المتغير
secondالذي يحتوي على4كرقم، وليسstring؟
تقوم المحولات البرمجية بإجراء تحويلات آمنة
يرى برنامج التحويل البرمجي C# مشكلة محتملة في عملية الصنع. يكون المتغيّر second من النوع string، لذا قد يتم تعيينه إلى قيمة مختلفة مثل "hello". إذا حاول المحول البرمجي C# تحويل "hello" إلى رقم، فقد يؤدي إلى حدوث استثناء في وقت التشغيل. لتجنب هذه الإمكانية، لا يقوم المحول البرمجي C# ضمنيا بإجراء التحويل من string إلى int نيابة عنك.
من منظور المحول البرمجي C#، ستكون العملية أكثر أمانًا لتحويل int إلى string وتنفيذ تسلسل بدلاً من ذلك.
إذا كنت تنوي إجراء إضافة باستخدام سلسلة، فإن المحول البرمجي C # يتطلب منك التحكم بشكل أكثر وضوحًا في عملية تحويل البيانات. وبعبارة أخرى، فإنه يفرض عليك أن تكون أكثر مشاركة بحيث يمكنك وضع الاحتياطات المناسبة في مكان للتعامل مع إمكانية أن التحويل يمكن أن يلقي استثناء.
إذا كنت بحاجة إلى تغيير قيمة من نوع البيانات الأصلي إلى نوع بيانات جديد ويمكن أن ينتج عن التغيير استثناء في وقت التشغيل، يجب إجراء تحويل بيانات.
لإجراء تحويل البيانات، يمكنك استخدام إحدى التقنيات المتعددة:
- استخدام أسلوب مساعد على نوع البيانات
- استخدام أسلوب مساعد على المتغير
-
Convertاستخدام أساليب الفئة
يمكنك إلقاء نظرة على بعض الأمثلة على هذه التقنيات لتحويل البيانات لاحقا في هذه الوحدة.
السؤال: هل من الممكن أن تؤدي محاولة تغيير نوع بيانات القيمة إلى فقدان المعلومات؟
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
ينبغي أن تشاهد المخرج التالي:
int: 3 decimal: 3مفتاح هذا المثال هو هذا السطر من التعليمات البرمجية:
decimal myDecimal = myInt;حيث إن أي قيمة
intيمكن بسهولة احتواؤها داخلdecimal، ويعمل المحول البرمجي على إجراء التحويل.يعني مصطلح تحويل توسيعي أنك تحاول تحويل قيمة من نوع بيانات قد يحتوي على معلومات أقلإلى نوع بيانات يمكن أن يحتوي على المزيد من المعلومات. في هذه الحالة، لا تفقد القيمة المخزنة في متغير من النوع
intالذي تم تحويله إلى متغير من النوعdecimal، المعلومات.عندما تعرف أنك تقوم بإجراء تحويل موسع، يمكنك الاعتماد على التحويل الضمني. يعالج المحول البرمجي التحويلات الضمنية.
تنفيذ تحويل
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");لتنفيذ التحويل، يمكنك استخدام عامل تشغيل
()التحويل لإحاطة نوع بيانات، ثم وضعه بجوار المتغير الذي تريد تحويله (مثال:(int)myDecimal). تقوم بإجراء تحويل صريح إلى نوع بيانات التحويل المحدد (int).احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
ينبغي أن تشاهد المخرج التالي:
decimal: 3.14 int: 3مفتاح هذا المثال هو هذا السطر من التعليمات البرمجية:
int myInt = (int)myDecimal;يحتوي المتغير
myDecimalعلى قيمة ذات دقة بعد الفاصلة العشرية. بإضافة تعليمات(int)التحويل ، فأنت تخبر المحول البرمجي C# بأنك تفهم أنه من الممكن أن تفقد هذه الدقة، وفي هذه الحالة، لا بأس. أنت تخبر المحول البرمجي أنك تقوم بإجراء تحويل مقصود، وهو تحويل صريح.
تحديد ما إذا كان التحويل "تحويلا موسعا" أو "تحويلا ضيقا"
يعني مصطلح تضييق التحويل أنك تحاول تحويل قيمة من نوع بيانات يمكنه الاحتفاظ بمزيد من المعلومات إلى نوع بيانات يمكن أن يحتوي على معلومات أقل. في هذه الحالة، قد تفقد معلومات مثل الدقة (أي، عدد القيم بعد الفاصلة العشرية). مثال على ذلك هو تحويل القيمة المخزنة في متغير من النوع decimal إلى متغير من النوع int. إذا قمت بطباعة القيمتين، فقد تلاحظ فقدان المعلومات.
عندما تعرف أنك تقوم بإجراء تحويل تضييقي، تحتاج إلى إجراء تحويل. التمثيل هو تعليمات إلى المحول البرمجي C# التي تعرف أنه قد يتم فقدان الدقة، ولكن كنت على استعداد لقبول ذلك.
إذا لم تكن متأكدا من فقدان البيانات في التحويل، فاكتب التعليمات البرمجية لإجراء تحويل بطريقتين مختلفتين ومراقبة التغييرات. يكتب المطورون اختبارات صغيرة بشكل متكرر لفهم السلوكيات بشكل أفضل، كما هو موضح في العينة التالية.
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
يجب أن تلاحظ مخرجات مشابهة لـ:
Decimal: 1.23456789 Float : 1.2345679يمكنك ملاحظة من الإخراج أن تحويل إلى
decimalfloatهو تحويل ضيق لأنك تفقد الدقة.
إجراء تحويلات البيانات
في وقت سابق، ذكر أن تغيير القيمة من نوع بيانات إلى آخر قد يتسبب في استثناء وقت التشغيل، ويجب عليك إجراء تحويل البيانات. بالنسبة إلى تحويلات البيانات، هناك ثلاث تقنيات يمكنك استخدامها:
- استخدام أسلوب مساعد على المتغير
- استخدام أسلوب مساعد على نوع البيانات
-
Convertاستخدام أساليب الفئة
استخدم ToString() لتحويل رقم إلى string
كل متغيّر نوع بيانات لديه طريقة أسلوب ToString(). يعتمد الأسلوب ToString() على كيفية تنفيذه على نوع معين. ومع ذلك، على معظم البدائيين، فإنه ينفذ تحويل توسيع. على الرغم من أن هذا ليس ضروريا تماما (نظرا لأنه يمكنك الاعتماد على التحويل الضمني في معظم الحالات) فإنه يمكنه التواصل مع المطورين الآخرين بأنك تفهم ما تفعله وأنه مقصود.
فيما يلي مثال سريع على استخدام الأسلوب ToString() لتحويل القيم intإلى قيم string بشكل صريح.
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك. عند تشغيل التعليمات البرمجية، يجب أن يعرض الإخراج تسلسلا للقيمتين:
57
string تحويل إلى int باستخدام Parse() أسلوب المساعد
تحتوي معظم أنواع البيانات الرقمية على Parse() أسلوب، والذي يحول سلسلة إلى نوع بيانات معين. في هذه الحالة، يمكنك استخدام Parse() الأسلوب لتحويل سلسلتين إلى int قيم، ثم إضافتها معا.
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك. عند تشغيل التعليمات البرمجية، يجب أن يعرض الإخراج مجموع القيمتين:
12خذ دقيقة لمحاولة اكتشاف المشكلة المحتملة مع مثال التعليمات البرمجية السابق؟ ماذا لو تم تعيين أي من المتغيرات
firstأوsecondإلى قيم لا يمكن تحويلها إلىint؟ يتم طرح استثناء في وقت التشغيل. يتوقع منك المحول البرمجي C# ووقت التشغيل التخطيط مسبقا ومنع التحويلات "غير القانونية". يمكنك التخفيف من استثناء وقت التشغيل بعدة طرق.أسهل طريقة للتخفيف من هذا الموقف هي باستخدام
TryParse()، وهو إصدار أفضل منParse()الأسلوب.
string تحويل إلى int باستخدام Convert الفئة
Convert تحتوي الفئة على العديد من الأساليب المساعدة لتحويل قيمة من نوع إلى آخر. في مثال التعليمات البرمجية التالي، يمكنك تحويل سلسلتين إلى قيم من النوع int.
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
ينبغي أن تشاهد المخرج التالي:
35إشعار
لماذا يُسمى الأسلوب
ToInt32()؟ لماذا لا يكونToInt()؟System.Int32هو اسم نوع البيانات الأساسية في مكتبة فئة .NET التي تعمل لغة الكمبيوتر C# على تعيينها إلى الكلمة الأساسيةint. لأن الفئةConvertأيضًا جزء من مكتبة فئة .NET، تُسمى باسمها الكامل، وليس اسم C# الخاص بها. من خلال تحديد أنواع البيانات كجزء من .NET Class Library، يمكن لعدة لغات .NET مثل Visual Basic وF # وIronPython وغيرها مشاركة نفس أنواع البيانات والفئات نفسها في .NET Class Library.يحتوي
ToInt32()الأسلوب على 19 إصدارا محملا بشكل زائد مما يسمح له بقبول كل نوع بيانات تقريبا.لقد استخدمت
Convert.ToInt32()الأسلوب مع سلسلة هنا، ولكن من المحتمل أن تستخدمTryParse()عندما يكون ذلك ممكنا.لذلك، متى يجب عليك استخدام
Convertالفئة؟Convertالفئة هي الأفضل لتحويل الأرقام الكسرية إلى أرقام كاملة (int) لأنها تقرب إلى الأعلى بالطريقة التي تتوقعها.
مقارنة التحويل وتحويله decimal إلى int
يوضح المثال التالي ما يحدث عند محاولة تحويل decimal إلى int (تحويل تضييقي) مقابل استخدام الأسلوب Convert.ToInt32() لتحويل decimal ذاته إلى int.
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق خارج التعليمات البرمجية من خطوة التمرين السابقة، وإضافة التعليمات البرمجية التالية:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
ينبغي أن تشاهد المخرج التالي:
1 2
تحويل الاقتطاعات وتحويل الجولات
عندما تقوم بالصب int value = (int)1.5m;، يتم اقتطاع قيمة العائمة بحيث تكون 1النتيجة ، مما يعني أن القيمة بعد تجاهل الفاصلة العشرية تماما. يمكنك تغيير القيمة الحرفية إلى 1.999m وستكون نتيجة التحويل هي نفسها.
عندما تقوم بالتحويل باستخدام Convert.ToInt32()، يتم تقريب القيمة الحرفية للأعلى بشكل صحيح إلى 2. إذا قمت بتغيير القيمة الحرفية إلى 1.499m، تقريبها لأسفل إلى 1.
خلاصة
لقد قمت بتغطية العديد من المفاهيم المهمة لتحويل البيانات وتحويلها:
- منع حدوث خطأ في وقت التشغيل أثناء إجراء تحويل البيانات
- قم بإجراء تحويل صريح لإخبار المحول البرمجي بأنك تفهم خطر فقدان البيانات
- الاعتماد على المحول البرمجي لتنفيذ تحويل ضمني عند إجراء تحويل موسع
-
()استخدم عامل تشغيل التحويل ونوع البيانات لتنفيذ التحويل (على سبيل المثال،(int)myDecimal) -
Convertاستخدم الفئة عندما تريد إجراء تحويل تضييقي، ولكنك تريد إجراء التقريب، وليس اقتطاع المعلومات
اختبر معلوماتك
الملاحظات
هل كانت هذه الصفحة مفيدة؟
لا
هل تحتاج إلى مساعدة مع هذا الموضوع؟
هل تريد محاولة استخدام Ask Learn لتوضيح هذا الموضوع أو إرشادك خلاله؟