الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

struct and calss

مغلق
بدأه بطران في 23 يناير 2003 · 5 رد · 1,054 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

حبيت أضيف فائدة على السريع :

لماذا ؟ تحتاج لتعريف class أو حتى structure قديما

هناك متغيرات تكون مبنية primtiv data types في داخل لغات البرمجة مثل ( int - float - bool ) و بواسطتها يمكن عمل كل شيء في البرمجة ( و إلا تكون لغة البرمجة ضعيف ) .

ولكن هناك حاللات يكون في استخدام المتغيرات في البرنامج متداخلا .. يعني مثلا :

تخيل أنك تريد أن تكتب برنامج يقوم بتنظيم المدرسة .. بحيث يكون اسم المادة و مجموع الدرجات فيها .

فيه هذه الحالة و باستخدام primtiv data types ستحتاج إلى مصفوفة من نوع int و أخرى من نوع string ( طبعا اللغات اللي ما تدعم string ستكون مضطر إلى تعريف مصفوفة ببعدين ) .

أيضا يجب عليك أن تعمل كود يوافق بين كل مادة .. و درجتها عن طريق index أو أي شيء تختاره .

ستواجهك صعوبات في عمليات الإضافة .. و الحذف ... و أيضا عملية الموافقة بين المصفوفتين .. لكنك في النهاية ستستطيع القيام بذلك .

تخيل بعد أن أضعت يومك كله في هذا جاءك أحدهم .. و قال أضف خانة للتقدير ( جيد - ممتاز - ... ) أتقع أنك قد تذبحة لأنك ستكون مضطرا تقريبا إلى تعديل ما لا يقل عن نصف الكود .

إذا ما هو الحل ..؟

الحل هنا يكون باستخدام ما يسمى user define data type أي المتغيرات المعرفة من قبل المستخدم باستخدام struct (للمعلومية كل المتغيرات مبنية بهذه الطريقة ) .



class TheClass
{
public int x;
}

struct TheStruct
{
public int x;
}

class TestClass
{
public static void structtaker(TheStruct s)
{
s.x = 5;
}
public static void classtaker(TheClass c)
{
c.x = 5;
}
public static void Main()
{
TheStruct a = new TheStruct();
TheClass b = new TheClass();
a.x = 1;
b.x = 1;
structtaker(a);
classtaker(B);
Console.WriteLine("a.x = {0}", a.x);
Console.WriteLine("b.x = {0}", b.x);
}
}
using System;

هذا المثال يبين الفرق المهم بين struct و class هو

أن ال struct يمثل بالضبط نوع متغيرات جديد ففي المثل كريقة الإرسال كانت إرسال بالقيمة .

أما بالنسبة للـ class فهو دائما كمرجع ( pass by refrence ) .

هذا اللي في بالي الآن لو تذكرت شيء أو حب أحد يضيف شيء ....

ما فيه أي إشكال .

تذكرت نسيت أكتب فائدة الـ user define data types :

1- سهل الفهم لأنك أنت اللي تحدد أسمه على راحتك .

2- إمكانية التعديل . حيث عند إضافة نوع جديد كل ما عليك هو أن تفوم بإضافته في الـ struct و تعديل العمليات الخاصة به . ( بدل البحث في الكود ... و تعديله زي السالفة اللي فوق)

014.gif
#3

شكرا لك أخي ..

في الحقيقة ليسنت جميع الأنواع هي Structures حيث هناك نوع مهم جدا string عبارة عن class ..

فرق جوهري آخر بين class & struct هو أن class تحجز في الـ Managed Heap بينما الـ struct في الـ Stack !

#4

أجل فيه توافق أفكار أخوي عمر ... الله يستر من سؤالك التالي . تحياتي

شكرا .. أبو فهد فاتنتني هالمعلومة للأسف .

بس أنا كنت توي مكشفها أمس لأني فتحت تعريف المتغيرات في بيئة .NET و جدت مجموعة كبيرة من المتغيرات على هيئة structures

أما مسألة الـ manged heap الخاصة بالكلاس فما أدري عنه اللي أعرفه أن الـ structure و الـ class كلها راح تتعرف في الـheap بسبب أنك تحجز أماكن مختلفة السعة من الذاكرة ... و لكن ! stack ????

about the MANGED heap is it contrle the allocation and dealloction by it self with out need to dealloct ( like the gapeg collector in JAVA )? I think so .

014.gif
#5

نعم يا عزيزي .. جميع أنواع القيمة Value Types تخزن في الـ Stack إلا اذا كانت في مصفوفة . أما الأنواع ذات الإشارة (Reference Types) فهي تخزن في Managed Heap ..

أبوفهد

هذا الموضوع مغلق.

مواضيع مشابهة