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

ما هي طريقة ال struct في السي شارب ؟

مغلق
بدأه الزعيم 2005 في 6 يونيو 2005 · 14 رد · 2,295 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

ما هي طريقة استخدام الـ struct في السي شارب ؟

أنا اعرف أنها مهمة في البرمجة وذلك من خبرتي في C++ ، ولكني حاولت فيها في السي شارب لكن مازبطت معاي ................

فما هي كيفية استخدامها لأني اريد معرفة هذا struct لأهميته لأنها سوف تسهل علي لعمل برنامجي الذي يعتمد على struct وخاصة عندما نعرف مصفوفة من نفس نوع الـ struct .................

وذلك بالــــــــــ ( Windows Application ) ... وشكراً لكم

#2

الstruct هي Value type User Defined Datatype اي ان الuser او المبرمج يقوم بعمل datastructure او هيكل للبيانات الخاصة به عن طريق استخدام اكثر من data type اخر لتكوين هيكل اكثر تعقيدا و هي تشبه الى حد كبير الclass و ان كان الفارق الجوهري ان الstruct يعتبر value type و يخزن في الstack و لكن الclass يعتبر reference type و يخزن في الheap

كمثال على الstruct

struct Person
{
string name;
int age;
DateTime birthdate;
}

و ايضا الفرق بين الstructs في ال ++C/C و الstructs في ال#C هي ان في ال++C/C يكون كل ما في داخل الstructs هو public by default و لكن العكس في ال#C فان كل ما في داخل الstruct هو private by default ففي المثال السابق لو حاولت استخدام هذا الstruct ستجد انك لا تستطيع الوصول الى المتغيرات name, age, birthdate و لكن باضافة

struct Person
{
public string name;
public int age;
public DateTime birthdate;
}

الان يمكنك استخدام المتغيرات و ان كان تركها private افضل و عمل accessors لها هو الحل الافضل

يمكن ايضا وضع methods داخل الstruct

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#3

وايضا الstruct لا يمكن عمل انهريت منها

او عمل كونستراكتور لها غير الديفولت

#4

السلام عليكم ورحمة الله وبركاته

أخي الكريم "باشمهندس" تعليقا على كلمة stack و heap

أرجو توضيح الفرق بينهما

وجزاك الله خيرا

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#5
اقتباس
أرجو توضيح الفرق بينهما
الـ Heap لا تحتوي على القيم الحقيقيه بل انها مجرد عناوين Addresses تشير الى قيمها في الذاكره ويمكن ان يكون هناك أكثر من عنوان يشير الى نفس القيمه وهذا مايحدث عندما نقوم بتمرير Objects بـ By Value فانه يقوم بعمل Reference آخر يشير الى نفس القيمه... أما الـ Stack فانها تحتوي على نسخ القيم الحقيقيه للمتغيرات وليست عناوين لها.

كما ان الـ Garbage Collection ملهاش دعوه بالـ Stack خالص.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#6
اقتباس
او عمل كونستراكتور لها غير الديفولت
لأ عادي بينفع تعمل Constructor للـ struct لكن لازم يكون له Paramaters.

لكن انت أكيد تقصد انه مينفعش تعمل ~ Destructor.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#7

طيب شباب انا عارف كيف اسوي تهيئة للـ struct .........

لكن كيف اعرف مصفوفة تتعامل مع الـ struct مثلاً

x.struct_name="Mohammed"ll

وهكذا لكن ما هي طريقة تعريف المفوفة من نوع الـstructr ( انا بعرف تعريف المتغير العادي منها )

حتى يتسنا لي التعامل مع المصفوفة عند الضغط على زر الـ button في Windows application

مع العلم أن الـ struct باين للكل في البرنامج وشكرا

واذا كان هناك برنامج بسيط عن الـ struct التي تتعامل معها المصفوفة ارجوا ارفاقه ......

وشكراااااااااااااااااااااااااااااااااااااااااااااااااا لكككككككككككككككككككككككككككككككككككككككككككم

#8
معتز شمس كتب:
الـ Heap لا تحتوي على القيم الحقيقيه بل انها مجرد عناوين Addresses تشير الى قيمها في الذاكره ويمكن ان يكون هناك أكثر من عنوان يشير الى نفس القيمه وهذا مايحدث عندما نقوم بتمرير Objects بـ By Value فانه يقوم بعمل Reference آخر يشير الى نفس القيمه... أما الـ Stack فانها تحتوي على نسخ القيم الحقيقيه للمتغيرات وليست عناوين لها.

كما ان الـ Garbage Collection ملهاش دعوه بالـ Stack خالص.

تعقيب بسيط للتوضيح

ال Heap يحتوي على القيم الحقيقة للمتغيرات من نوع referance type اي ال Instance variables ، حيث يكون مخزن العنوان لهم في ال stack بينما القيمة الحقيقة لهم تكون مخزنة في ال heap

بينما ال stack يحتوي على القيم الحقيقة للمتغيرات value type

ايضا التعامل مع ال Stack اسرع من ال heap لكنه محدود بالذاكرة، لذلك عند تعريف المتغيرات بكثرة من نوع value type وابقائهم لفترة طويلة قد يبطئ عمل البرنامج اكثر من إستخدام ال referance type

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#9

هذا مثال لعمل مصفوفة بحجم 3 وتخزين الأسماء بها ثم عرضها حسب ال Struct الموضوع أعلاه

  {
 	 Person[] Persons = new Person[3];
 	 Persons[0].name = "Mohammed";
 	 Persons[1].name = "Ali";
 	 Persons[2].name = "Sami";

 	 for(int i=0; i<3; i++)
    MessageBox.Show("Person No " + i.ToString() + " = "+ Persons.name);

  }

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#10

السلام عليكم ورحمة الله وبركاته

معتز شمس كتب:
كما ان الـ Garbage Collection ملهاش دعوه بالـ Stack خالص.

يعني أفهم من كده إن Garbage Collection لا يمسح القيم الموجودة في Stack بعد الإنتهاء من إستخدامها

جزاكم الله خيرا

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#11

السلام عليكم ورحمة الله وبركاته

محمد نسمان كتب:
ال Heap يحتوي على القيم الحقيقة للمتغيرات من نوع referance type اي ال  Instance variables ، حيث يكون مخزن العنوان لهم في ال stack بينما القيمة الحقيقة لهم تكون مخزنة في ال heap

أرجوا توضيح هذا الجزء بمثال توضيحي

جزاك الله خيرا

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#12
Ahmed H. Alawady كتب:
السلام عليكم ورحمة الله وبركاته

يعني أفهم من كده إن Garbage Collection لا يمسح القيم الموجودة في Stack بعد الإنتهاء من إستخدامها

جزاكم الله خيرا

نعم صحيح فالGarbage Collection ليس له علاقة بالStack و هذا لانه يبحث عن الUnreferenced Objects ليمسحها و الStack اساسا لا يكون فيها Reference Objects

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#13

شكرا أخ محمد على تعقيبك المفيد.

أحمد العوضي ::

شاهد هذا المثال ... سنقوم الآن بعمل كلاس اسمه BatekhaClass ونضع به Size و Price كـ Public Members ::

class BatekhaClass
{
public int size;
public int  price;
}

طبعا هذه ليست طريقه جيده في كتابة الكلاسات ولكنه مثال للتوضيح ... فينصح دائما عمل الـ Members كـ Private ثم القيام بعمل خواص Properties لاسترجاع واسناد القيم لهم.

المهم ... كما تعلم انه لن يتم حجز مساحه لهذا الكلاس في الـ Heap الا باستخدام الكلمه new لعمل أوبجكت منه ::

BatekhaClass batekhaObject = new BatekhaClass();
batekhaObject.price = 5;
batekhaObject.size = 1;

بمجرد كتابة الكود السابق فانه يتم مباشرة حجز المساحه داخل الـ Managed Heap وتحتوي على قيمتي الـ price = 5 و size = 1.

وبعد توضيح الأخ محمد يتم ايضا وضع مؤشر فقط داخل الـ Stack يشير الى هاتين القيمتين ولكنه لا يحتوي على قيمهم.

واذا أردت في أى وقت قطع هذا المؤشر ( الـ Reference ) الذي يشير الى هذه القيم ... يمكنك عمل ::

batekhaObject = null;

وفي حالة قطع هذا المؤشر وفي حاله معينه ( عندما تكون الـ Heap ممتلئه بالقيم مثلا ) ... ستقوم الـ Garbage Collection بالعمل وبالطبع ستكتشف ان القيم المحجوزه في الـ Heap لم يعد لها Reference وبالتالي ستقوم بحذف هذه القيم.

اعلم أيضا أنه عندما تقارن باستخدام الـ == Operator مع الـ Reference Type فانك تقوم بمقارنة هذا المؤشر الموجود في الـ Stack وليس القيم الموجوده في الـ Heap.

مثلا قم بعمل أوبجكت آخر من نفس الكلاس الذي قمنا بكتابته وأسند نفس القيم التي أسندناها للأوبجكت batekhaObject ::

BatekhaClass batekhaObject2 = new BatekhaClass();
batekhaObject2.price = 5;
batekhaObject2.size = 1;

وبعد ذلك جرب عمل المقارنه وستكتشف أنهم غير متساوين بالرغم من أننا أسندنا نفس القيم للـ Objects ::

if (batekhaObject == batekhaObject2)
MessageBox.Show("Equal");
else
MessageBox.Show("NOT equal");

الرساله التي ستظهر هى ( NOT equal ) لأنه تم عمل مقارنه ليس بقيم الـ price والـ size وانما تم عمل المقارنه على حسب المؤشرين .... وبالطبع فانهم غير متساوين.

ستسألني سؤال الآن وهو ::

يا معتز , الـ string هى Reference Type وبالرغم من ذلك قم بكتابة هذا الكود وظهرت النتيجه عاديه كما توقعتها ( Equal ) ::

string stringFirst = "Ahmed";
string stringSecond = "Ahmed";

if (stringFirst == stringSecond)
MessageBox.Show("Equal");
else
MessageBox.Show("NOT Equal");

الجواب هو لأنه تم عمل Operator Overloading للـ String.

مثلا ... اذا كنت تريد عمل المقارنه ( بـ if مثلا ) بين الـ batekhaObjects كأنك تقارن بين متغيرين string وتود أن تحصل على النتائج هذه المره بشكل صحيح فيجب عليك أن تتعلم الـ Operator Overloading.

ولكن لو كان الكلاس بسيط ولاتريد عمل Overloading للـ == Operator وهذه الأشياء ... فيمكنك عمل المقارنه بهذا الشكل مثلا ::

if (batekhaObject.price  == batekhaObject2.price)
MessageBox.Show("Equal");
else
MessageBox.Show("NOT equal");

والسلام عليكم ... هو مين اللي في الصوره اللي في توقيعك ده يا أحمد ... ( شكله كدا راجل مهم ) ؟

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#14
معتز شمس كتب:
والسلام عليكم ... هو مين اللي في الصوره اللي في توقيعك ده يا أحمد ... ( شكله كدا راجل مهم ) ؟

الأسد خطاب، رحمة الله عليه، احد الابطال المجاهدين في الشيشان الذى دوخ الروس في الشيشان واغتاله الروس قبل 3 سنوات تقريبا (الله يهلكهم)

لا تحزن:

إن كنت فقيرا فغيرك محبوس في دين، وإن كنت لا تملك وسيلة نقل فسواك مبتور القدمين، وان كنت تشكوا من آلام فغيرك يرقدون على الاسرة البيضاء و من سنوات، وان فقدت ولدا فغيرك فقد عددا من الأولاد و في حادث واحد.

لا تحزن:

فأنت تشرب الماء الزلال، و تستنشق الهواء الطلق، و تمشي على قدميك معافى، و تنام ليلك آمنا.

#15

الله يعطيكم العافية ما قصرتوا .... و الشكر لكم ...........

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

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