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

أريد المساعدة من أهل C++ .NET خاصة لتوضيح

مغلق
بدأه Snaa في 12 نوفمبر 2004 · 5 رد · 663 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أرجو المساعدة في الC++.NET خاصة

كنت اعمل لمدة سنة على ++C الاصدار السادس

ولكن مع ضهور اصدار NET فوجأة بالإختلافات المعقدة التي لم أستطع أن أجد لها الحلاً

لذلك فضلت أن أبدأ من البداية

لذلك طلبت منكم الفروق الرئيسية ل++C الاصدار السادس والاصدار الحالي Net

ولآن أريد منكم برنامجاً مصغراً يعمل على إصدار NET ولو كان يطبع جملة ترحبية فقط كبداية

#2

لاتوجد إختلافات كبيرة ,, طفيفة جدا ,,

لبدأ مشروع جديد على new Project - > Visual c++ -> Console App

ولاتكترث بالملف الإضافي الموجود stdafx.h وال stdafx.cpp ,,

قم بكتابة مشروعك كما هو وإمسح المدخلات في stdafx.h ,,

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

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3

كتبت هذا النص قديما ولا أدري عن صحتة جيداً في WORD

بدء العمل مع C++

توجد فصيلة String القياسية في ملف الرأس string.h.

قبل الإعلان عن فصيلة نسبقها بالكلمة المحجوزة __gc لتكون الفصيلة خاضعة للإدارة و تجميع النفايات و تكون الكائنات إليها مرجعية.

قبل الإعلان عن فصيلة نسبقها بالكلمة المحجوزة __value لتكون الفصيلة خاضعة للإدارة وتوضع في المكدس و تكون الكائنات إليها قيمية.

هناك أنواع بيانات جديدة أضيفت للغة مثل: __int8, __int16, __int32 , __int64, wchar_t.

تستخدم الكلمة #using لجلب ملفات الربط الديناميكي للغة DLL مثال: #using <mscorlib.dll>.

كما تستخدم الكلمة #program once لمعالجة ملف الرأس مرة واحدة.

العوامل البتية

And(&) : يقارن بين 2bits إذا كان كلاهما 1 يكون 1.

Or(|) : يقارن بين 2bits إذا كان أحدهما 1 يكون 1.

Or(^) : يقارن بين 2bits إذا كان أحدهما 1 والأخر 0 يكون 1.

Not(~) : يقلب البتات من 1-0 والعكس.

<< الإزاحة اليسرى : يزيح بتات المعامل الأيسر بمقدار المعامل الأيمن إلى اليسار مع ملء البتات الخالية بـ 0.

>> الإزاحة اليمنى : عكس السابق. تملأ الفراغ بـ0 عندما يكون العدد بدون إشارة. وتملأ بـ1 عندما تكون الإشارة سالبة.

البرمجة الكائنية المنحى

الكلمة الأساسية __abstract تدل على أن الفئة وهمية(مجردة). أي لا يمكن أن تنتج كائنات وإنما تكون أصل لعدة فئات.

الكلمة الأساسية __super:: تستخدم لأعضاء الفئة القاعدة.

الكلمة الأساسية __sealed كناية عن أن الفئة مختومة. كـ final في لغة java.

الواجهات:

يتم الإعلان عنها باستخدام الكلمة __gc __interface.

تبدأ أسماء الواجهات بالحرف I.

أساسيات البرمجة .NET

التحميل الزائد للمعاملات:

C++ operator symbol Name of alternative method Name of operator

Not defined ToXxx or FromXxx op_Implicit

Not defined ToXxx or FromXxx op_Explicit

+ (binary) Add op_Addition

- (binary) Subtract op_Subtraction

* (binary) Multiply op_Multiply

/ Divide op_Division

% Mod op_Modulus

^ Xor op_ExclusiveOr

& (binary) BitwiseAnd op_BitwiseAnd

| BitwiseOr op_BitwiseOr

&& And op_LogicalAnd

|| Or op_LogicalOr

= Assign op_Assign

<< LeftShift op_LeftShift

>> RightShift op_RightShift

Not defined LeftShift op_SignedRightShift

Not defined RightShift op_UnsignedRightShift

== Equals op_Equality

> Compare op_GreaterThan

< Compare op_LessThan

!= Compare op_Inequality

>= Compare op_GreaterThanOrEqual

<= Compare op_LessThanOrEqual

*= Multiply op_MultiplicationAssignment

-= Subtract op_SubtractionAssignment

^= Xor op_ExclusiveOrAssignment

<<= LeftShift op_LeftShiftAssignment

%= Mod op_ModulusAssignment

+= Add op_AdditionAssignment

&= BitwiseAnd op_BitwiseAndAssignment

|= BitwiseOr op_BitwiseOrAssignment

, None assigned op_Comma

/= Divide op_DivisionAssignment

-- Decrement op_Decrement

++ Increment op_Increment

- (unary) Negate op_UnaryNegation

+ (unary) Plus op_UnaryPlus

~ OnesComplement op_OnesComplement

يجب أن يكون التحميل بالشكل التالي:

Static class-name op_operator(par…)

{

}

الاستثناءاتException:

يتم رمي (قذف) الاستثناءات باستخدام الكلمة الأساسية throw new _nameException_.

جميع الاستثناءات ترث من الفئة Exception داخل مساحة الاسم System::Exception.

التقاط الاستثناءات (معالجتها) تتم باستخدام التركيب التالي:

try

{

// الجزء المتوقع أن يرمي استثناء

{

catch(nameException1* one)

{

// معالجة الاستثناء

}

catch(nameException2* two)

{

// معالجة

}

الفئة الوصف

System::ApplicationException خطاء مميت في البرنامج

System::ArgumentException وسائط الدوال مشتق منه Null و OutOfRange

System::ArithmeticException خطاء رياضي

System::Exception أصل الاستثناءات

System::IndexOutOfRangeException خارج حدود المصفوفة

System::InvalidCastException تحويل غير صالح

System::MemberAccessException الوصول إلى عضو غير موجود

System::NotSupportedException استحضار طريقة غير مدعومة

System::NullReferanceException

System::OutOfMemoryException عند امتلاء الذاكرة

System::SystemException الفئة القاعدة للاستثناءات التي يمكنمعالجتها بواسطة المستخدم

System::TypeLoadException

__try_cast<typedata*> للتحويل إلى نوع من نفس الجنس وعندما يفشل يقذف استثناء InvalidCastException وهو مشابه لـ dynamic_cast<>

المصفوفات والمجموعات Array & Sets:

المصفوفات الخاضعة للإدارة ترث من الفئة System::Array جميع الطرق والخصائص. وتكون خاضعة أيضاً لتجميع النفايات.

كيفية الإعلان عن مصفوفة مدارة

وذلك بالإعلان عن مصفوفة من أحد أنواع .NET كالتالي Int32 array = new Int32; وبذلك ترث الفئة Array.

استعمال الكلمة __gc مع الأنواع التقليدية كالتالي int array __gc[] = new int __gc;

المصفوفة المرجعية : هي مصفوفة لعناصر هي مراجع لكائنات. ويتم الإعلان كالتالي:

String* array[] = new String*;

array[0] = new String("s");

array[1] = "e";

المصفوفة المتعددة الإبعاد يتم الإعلان عنها كالتالي:Int32 array[,] = new Int32[s1,s2];.

كما يتم الإعلان عن مصفوفة غير مدارة من أحد أنواع .NET باستخدام الكلمة __nogc كالتالي: Int32 array __nogc;

الفئة Array في .NEY

هذه الفئة تورث جميع المصفوفات المدارة أعضائها وتشمل الخصائص التالية:

الخاصية الوصف

IsFixedSeize هل المصفوفة ذات حجم ثابت (صح)

IsReadOnly هل هي للقراءة فقط (خطاء)

IsSynchronized هل هي آمنة (خطاء)

Length عدد العناصر

Rank عدد الأبعاد

أما المناهج:

Static BinarySearch

بحث عن قيمة في مصفوفة أحادية البعد

staticClear

تمهيد بـصفر أو NULL

Clone

إنشاء نسخة سطحية

Static Copy

نسخ مصفوفة أو جزء منها

CopyTo

نسخ مصفوفة أو جزء منها

GetEnumerator

تعيد معدد للمصفوفة

GetLength

تعيد عدد العناصر في البعد المحدد

GetLowerBound

تعيد الحد السفلي للبعد المحدد كرقم صحيح

GetUpperBound

تعيد الحد العلوي للبعد المحدد كرقم صحيح

GetValue

تعيد القيمة

Static IndexOf

تعيد فهرس التواجد الأول (بحث)

Initialize

تنفذ المشيد للأنواع القيمية

Static LastIndexOf

تعيد فهرس التواجد الأخير

Static Reverse

تعكس ترتيب العناصر في كل أو جزء منها

SetValue

تسند قيمة

Static Sort

ترتب العناصر في أحادية البعد

النسخ باستخدام الدالة System::Array::Copy(a,ai,b,bi,c);

حيث أن a هو المصفوفة المصدر و ai الفهرس و b المصفوفة الهدف و bi فهرس البداية و c عدد العناصر المنسوخة.

البحث:

String* sa[] = {"Dog", "Cat", "horse", "Dog", "Cat"};

String* s = "Dog";

Int pos = Array::IndexOf(sa, s);// بحت عن أول تواجد

Pos = Array::IndexOf(sa, s, pos+1);// بحث بداية من الفهرس

الناتج هو 3 للإستدعاء الثاني بسبب الإزاحة.

تتبع LastIndexOf نفس الاسلوب لكنها تبحث من الأسفل

الفرز:

الفرز يتم باستخدام الدالة Sort حسب الترتيب . ويمكن ترتيبها حسب مفاتيح مستعملة من مصفوفة اخرى.

يجب أن يكون نوع المصفوفة يطبق الواجهة IComparer التي تملك الطريقة Compare تعيد 1- و 0 و 1 الممرر أكبر أو يساوي أو أصغر على التوالي. قبل تنفيذ الفرز.

ويمكن عكس ترتيب عناصر المصفوفة باستخدام Reverse.

المعددات Enumerator:

تعيد الطريقة GetEnumerator مؤشر من الواجهة IEnumerator التي تمتلك الطرق التالية:

1. MoveNext .

2. Reset ترجع المعدد إلى ما قبل الأول.

3. Current.

الخصائص property

تمنع OOP إظهار بيانات الفئات لسببين:

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

2. قد يعطي المستخدم بيانات عير ملائمة وهذا يودي إلى فشل البرنامج.

أتاحت لغة C++ المدارة الخصائص بديلاً عن دوال الوصول إلى البيانات Get & Set وتنقسم إلى نوعين: 1- خصائص عددية. 2- خصائص مفهرسة.

تطبيق الخصائص العددية

تأخذ الشكل التالي:

__property retype get_nameproperty () { return ver; }

__property void set_nameproperty (type* s) { ver = s; }

وهاتان الخاصيتان هما تنفيذ وصول إلى العضو البياني ver .

تطبيق الخصائص المفهرسة

إذا كانت الفئة تدعم المعددات Enumerator يمكن تطبيق الخصائص المفهرسة كالتالي(مثال):

__property Account* get_Acct(long num)

{

IEnumerator* ie = accts->GetEnumerator();

While(ie->MoveNext())

Return ie->Current();

}

الشكل العام:

__property retype get_nameproperty (index* i);

__property void set_nameproperty (index* i, type* s);

المفوضون(المندوبون) والإحداث Delegates & Events

المفوضون

عبارة عن فئة تتيح لك استحضار طريقة واحدة أو أكثر تملك توقيع معين.

تعريف المفوض

نستعمل الكلمة الأساسية __delegate كالتالي:

__delegate retype nameDelegate (paratype,,,);

استدعاء الدوال

يجب أولاً تعريف كائن من المفوض وتسليمه اسم الدالة مع مؤشر إلى الكائن الذي يستعمل الاستدعاء كالتالي:

nameDelegate* obj = new nameDelegate (ptr, & nameMetod);

يتم تنفيذ الدالة كالتالي:

Obj->Invoke(paraobj);

دوال الأعضاء الساكنة تأخذ المؤشر null = 0.

يستطيع مفوض تنفيذ أكثر من دالة وذلك بدمج مفوضين معاً بحث أن المفوضين الأساس يمكن أن يكونا مفوضين متعددي الاستدعاء راجع Multicast.

الأحداث

المفهوم غير واضح الآن.

برمجة Windows Forms

وهي برمجة نوافذ ويندوز وتوجد داخل المخزن العظيم System.Windows.Forms للأسماء. ويجب تضمين الملفين System و System.Windows.Forms لبرمجتها وبدلاً من الدالة main نستخدم الدالة WinMain .

أفضل الطرق لبناء النماذج هي كتابة فصائل ترث من الفصيلة Form وفي داخل الدالة WinMain نستدعي الدالة Application::Run(new nameclass).

راجع الملف CppForm.cpp لتفاصيل هذا الفصل

#4

ياسلام عليك يا mossa يارائع ,, كلام جميل ويبين بإختصار بليغ ماحدث في السي++ دوت نت تحديدا ,,

يا Snaa لو كنت تريد أن تتعلم السي++ دوت نت الجديدة وليس السي++ العادية في مصرف ال Visual Studio.NET في هذه الحال عليك بواحد من إثنين :

الأول أن تتعلم ال MC++ وهي التي تحدث عنها أخ mossa ,, لكن للأسف Microsoft لم تكن تعرف ماتفعل وقت إصدارها مع بداية ظهور الدوت نت ,, وهذه اللغة معقدة في صياغتها ,, وليست بالتعقيد المفيد الذي يفضي للمرونة ,,

لذا قامت مؤخرا بإصلاح هذا الخطأ بتصدير ال C++/CLI والتي بسببها إفتتحنا القسم الفرعي في أعلى قسم السي++ ,,

لذا عليك من الآن بال C++/CLI وليس بال MC++ ,, لأن ال MC++ إنتهت حاليا ,, لكن دعم تصريفها موجود في المصرفات الجديدة ,, بشرط تصريف الكود مع Option وهو clr:oldsyntax/

من الأفضل لك أن تتبنى ال C++/CLI إستعدادا للمستقبل ,, وحاليا نسخة البيتا 1 موجودة للتحميل وإدخل القسم وستعرف كل شيء ,,

ونسخة البيتا 2 لكل الدوت نت ستصدر تقريبا في شهر 2 من 2005 يعني بعد 3 أشهر ,,

والنسخة الكاملة ستصدر شهر 5 أو 6 من 2005 .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5

شكرا لكم جميعا

ولكن سؤالي إلى المراقب العام إذا قمت بتحميل ماتقو في جهاز الذي يحمل Microsft Visual .Net

هل سيؤثر عليه أم لا

وإن كان يؤثر مالعمل

#6
اقتباس
إذا قمت بتحميل ماتقو في جهاز

مافهمت شيء ,, لكن إجابة السؤال أن غالبا لن يؤثر عليه .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

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

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