كيف تغير نوع كائن من إلى كائن مجهول (بدون التعريف)

هل احتجت في يوم أو في مهمة إلى تغير نوع كائن object إلى كائن غير معرف (anonymous type)؟ الأمر في غاية البساطة:

 

private T ConvertTo<T>(T typeHolder, object obj) => (T)obj;

 

ولكن قد تتساءل ما الحاجة لهذه المعلية وخاصة أن شرط التحويل أن يكون الكائن object هو فعلا يمثل كائن غير معرف حتى يتم التحويل بشكل ناجح وصحيح.

تساؤلك في محله والجواب انه قد تحتاج إلى إنشاء نسخة ثانية أو ثالثة من كائن غير معرف (anonoymous type) باستخدام  

FormatterServices أو Activator.

 

ملاحظة: هناك فرق في قدارت كلا الفئتين Activatior و FormatterServices. في حين أن Activator تتطلب منك مسبقا معرفة شكل الباني من حيث القيم الممررة (برامترات) إذ أن الأنواع غير مسبقة التعريف لا تحتوي على باني افتراضي أو باني بدون قيم ممررة (Parameterless Constructor) وهذا سوف يسبب متاعب خاصة مع الأنواع المعقدة (Complex Type)

 

var car = new { Maker = “BMW”, Type = “Sedan”, Year = 2017 };
var anotherCar = Activator.CreateInstance(car.GetType(), new object[] { “Mercedes-Benz”, “Four-Wheels”
, 1995 });
anotherCar.Dump();

 

5ø4

 

Maker

Mercedes-Benz

Type

Four-Wheels

Year

1995

 

ولكن ماذا عن المثال التالي:

var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } };
var anotherComplexCar = Activator.CreateInstance(complexCar.GetType(), new object[] { “Mercedes”, new object[] { “Lama”, “Malek”
} });
anotherComplexCar.Dump();

 

6MissingMethodException4

Constructor on type ‘<>f__AnonymousType1`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[<>f__Anonymou…

المشكلة أن القيم الممررة لم تكن توافق شكل الباني

 

الحل الثاني هو استخدام FormatterService التي توفر عدد من التوابع لإنشاء نسخة من كائن object الميزة التي تقدمها أنها ستقوم بإنشاء نسخة من كائن دون استدعاء الباني

 

var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } };
//var anotherComplexCar = Activator.CreateInstance(complexCar.GetType(), new object[] {“Mercedes”, new object[] { “Lama”, “Malek”}} );

var anotherComplexCar = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(complexCar.GetType());

anotherComplexCar.Dump();

 

5ø4

 

Maker

null

Owners

null

 

لكن التابع GetUninitializedObject سوف يعيد نسخة لكن من نوع object وبالتالي نحتاج إلى عمل تغير نوع من object إلى نوع الكائن المجهول. علينا استخدام التابع المعرف في أول المقالة على النحو التالي:

private T CastTo<T>(T typeHolder, object obj) => (T)obj;

 

var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } };
//var anotherComplexCar = Activator.CreateInstance(complexCar.GetType(), new object[] {“Mercedes”, new object[] { “Lama”, “Malek”}} );

var anotherComplexCar = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(complexCar.GetType());
var castedAnotherComplexCar = CastTo(complexCar, anotherComplexCar);

anotherComplexCar.Dump();

 

المصادر:

[1]. https://stackoverflow.com/a/1409776/2696230

[2]. https://connect.microsoft.com/VisualStudio/feedback/details/521722/system-activator-createinstance-throws-system-missingmethodexception-with-constructor-containing-an-optional-parameter

[3]. https://stackoverflow.com/a/2501231/2696230

كيف تغير نوع كائن من object إلى كائن مجهول (بدون التعريف) Anonymous Type

هل احتجت في يوم أو في مهمة إلى تغير نوع كائن object إلى كائن غير معرف (anonymous type)؟ الأمر في غاية البساطة:

 

private T ConvertTo<T>(T typeHolder, object obj) => (T)obj;

 

ولكن قد تتساءل ما الحاجة لهذه المعلية وخاصة أن شرط التحويل أن يكون الكائن object هو فعلا يمثل كائن غير معرف حتى يتم التحويل بشكل ناجح وصحيح.

تساؤلك في محله والجواب انه قد تحتاج إلى إنشاء نسخة ثانية أو ثالثة من كائن غير معرف (anonoymous type) باستخدام  

FormatterServices أو Activator.

 

ملاحظة: هناك فرق في قدارت كلا الفئتين Activatior و FormatterServices. في حين أن Activator تتطلب منك مسبقا معرفة شكل الباني من حيث القيم الممررة (برامترات) إذ أن الأنواع غير مسبقة التعريف لا تحتوي على باني افتراضي أو باني بدون قيم ممررة (Parameterless Constructor) وهذا سوف يسبب متاعب خاصة مع الأنواع المعقدة (Complex Type)

 

var car = new { Maker = “BMW”, Type = “Sedan”, Year = 2017 };
var anotherCar = Activator.CreateInstance(car.GetType(), new object[] { “Mercedes-Benz”, “Four-Wheels”
, 1995 });
anotherCar.Dump();

 

5ø4

 

Maker

Mercedes-Benz

Type

Four-Wheels

Year

1995

 

ولكن ماذا عن المثال التالي:

var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } };
var anotherComplexCar = Activator.CreateInstance(complexCar.GetType(), new object[] { “Mercedes”, new object[] { “Lama”, “Malek”
} });
anotherComplexCar.Dump();

 

6MissingMethodException4

Constructor on type ‘<>f__AnonymousType1`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[<>f__Anonymou…

المشكلة أن القيم الممررة لم تكن توافق شكل الباني

 

الحل الثاني هو استخدام FormatterService التي توفر عدد من التوابع لإنشاء نسخة من كائن object الميزة التي تقدمها أنها ستقوم بإنشاء نسخة من كائن دون استدعاء الباني

 

var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } };
//var anotherComplexCar = Activator.CreateInstance(complexCar.GetType(), new object[] {“Mercedes”, new object[] { “Lama”, “Malek”}} );

var anotherComplexCar = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(complexCar.GetType());
anotherComplexCar.Dump();

 

5ø4

 

Maker

null

Owners

null

 

لكن التابع GetUninitializedObject سوف يعيد نسخة لكن من نوع object وبالتالي نحتاج إلى عمل تغير نوع من object إلى نوع الكائن المجهول. علينا استخدام التابع المعرف في أول المقالة على النحو التالي:

private T CastTo<T>(T typeHolder, object obj) => (T)obj;

 

var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } };
//var anotherComplexCar = Activator.CreateInstance(complexCar.GetType(), new object[] {“Mercedes”, new object[] { “Lama”, “Malek”}} );

var anotherComplexCar = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(complexCar.GetType());
var castedAnotherComplexCar = CastTo(complexCar, anotherComplexCar);
anotherComplexCar.Dump();

 

المصادر:

[1]. https://stackoverflow.com/a/1409776/2696230

[2]. https://connect.microsoft.com/VisualStudio/feedback/details/521722/system-activator-createinstance-throws-system-missingmethodexception-with-constructor-containing-an-optional-parameter

[3]. https://stackoverflow.com/a/2501231/2696230

هل تود تحويل نص كامل إلى سطر واحد؟؟

الأمر بسيط Notepad++ يوفر هذه الإمكانية

من قائمة Edit ←Line Operations ← Join Lines (لاحظ الصورة 1)

clip_image002

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

بعض الحالات المفيدة ، مثل اسناد قيمة إلى متحول (variable) ، فمثلا اذا كان لديك ملف من هيئة xml وأردت أخذ محتواه واسناده إلى متحول سيكون من اللازم تحويل نص الـ xml إلى سطر واحد قبل اسناده.

طرق إجراء عملية التبديل بين حقلين (Swap Two Variables)

 

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

أهلا ومرحبا بكم،،

في هذه المقالة القصيرة سنتعرف إلى طرق مختلفة للتبديل بين حقلين two variables. بشكل عام عملية التبديل تعرف باسم تبديل قيم حقلين swap. من بدأ بتعلم البرمجة سيمر clip_image002على حالة قد يحتاج فيها إلى تبديل قيم حقلين ليصبح الحقل الأول يحمل قيمة الحقل الثاني، في حين تصبح قيمة الحقل الثاني هي قيمة الحقل الأول سابقا قبل التبديل. الطريقة التقليدية التي نعرفها وهي باستخدام حقل إضافي ثالث ليقوم بدور الوسيط ليقوم بحفظ قيم أحد الحقلين من الضياع أثناء إجراء عملية التبديل. لكن هل تعلم أنه بإمكانك إجراء عملية التبديل هذه بطرق أخرى دون الحاجة إلى حقل ثالث وسيط.

قد تتعجب وتتسائل ما الحاجة إلى طرق أخرى إن كانت الطريقة التقليدية تفي بالغرض؟!ّ الجواب هو إذا كنت تبرمج الأجهزة الصغيرة التي لا تتعدى ذاكرتها عدة بايتات فقط , عندها ستضطر إلى البحث عن طرق أخرى للتقليل من استهلاك الذاكرة أو حتى في حال عدم وجود مساحة كافية في الذاكرة لاستخدام أي حقل إضافي.

دعنا نقم أولا بعرض طريقة الكود التقليدي. كود1 يعرض عملية التبديل باستخدام العملية الحسابية. طبعا كلمة ref تستخدم في لغة السي شارب C# وهي تكافئ تماما & في لغة السي بلس بلس (C++)

كود 1. التبديل بين الحقول Variables باستخدام حقل إضافي

void Swap(ref int a, ref int b)
{
      int c;

      c = a;
      a = b;
      b = c;
}

لاحظ في كود2 التالي تم استخدام عمليات الجمع والطرح للتبديل بين الحقول دون الحاجة إلى حقل إضافي. الكود الجديد فيه ميزة وعلة. الميزة توفير مساحة في الذاكرة فلا حاجة لحقل ثالث. أما العلة فهي قد يحصل Overflow طفحان بسبب ناتج جمع قيميتين قد ينتج عنه عدد كبير لا يمكن استيعابة في الحقل الحالي. كود3 يحل هذه المشكلة باستخدام exclusive-OR

كود 2. التبديل بين الحقول Variables باستخدام العمليات الحسابية (الجمع والطرح)

void Swap(ref int a, ref int b)
{
     a = a + b;
     b = a – b;
     a = a – b;
}

في الكود التالي تم استخدام exclusive-OR ، وهو عميلة تتم على مستوى البتات (قيم ثنائية 1 أو 0) يمكن مراجعة موقع مايكروسوفت (انقر هنا) لتحصل على المزيد من الشرح أفضل من السابق بسبب أن إحتمال حدوث فائض غير وارد.

كود 3. التبديل بين الحقول Variables باستخدام exlusive-OR

static void Swap(ref int a, ref int b)
{
     a = a ^ b;
     b = a ^ b;
     a = a ^ b;
}

في نهاية هذه المقالة ستكون قد تعرفت على طرق مختلفة للتبديل بين حقلين بثلاث طرق:

  •     1. الطريقة التقليدية باستخدام حقل ثالث إضافي
  •     2. طريقة حسابية (الجمع والطرح) لكن قد يحصل خلل بسبب عدم استيعاب الحقل لجمع عددين في حال فقط أن جمعها ينتج عنهما قيمة كبيرة
  •     3. استخدام المعامل exlusive-OR، والتي تقوم بالعمل على مستوى البتات (بالشكل العدد الثنائي)

كيف يتم دعم لغات متعددة للتطبيق في بيئة تطبيق ويندوز الكلاسيكي Windows Client Application في الدوت نت .NET

1222c8fb-51b8-49e0-90f5-70bcd05f311aفي يومنا هذا العديد من التطبيقات تسعى لمخاطبة قسما كبيرا من المستخدمين على مستوى العالم ، لا ريب أن ذلك يحتاج إلى استخدام مختلف لغات القوم و ألسنتهم. على كل حال ، في بيئة مايكروسوفت دوت نت ذلك في منتهى السهولة و لا يتعدى تحقيق ذلك سوى بضع خطوات

بعد أن نقوم بإعداد شاشات و واجهات تطبيق ما ، نقوم باتباع الخطوات التالية:

  1. بعد التأكد من أن التركيز (Focus) على الشاشة أو الواجهة ككل
  2. نذهب إلى نافذة الخصائص
  3. في نافذة الخصائص تغير قيمة الخاصيتين:
  •         أ . Localizable من False إلى True
  •         ب. Language من (Default) إلى Arabic

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

أ. تم تغير خصائص النافذة Form1 كما يلي (لاحظ الشكل):

  •            . Text: النافذة الرئيسية
  •            . RightToLeft: نختار Yes
  •            . RightToLeftLayout: نختار True

ب. تم تغير خصائص الأداة الزر button1 كما يلي:

  •             . Text: إنقر هنا

 

win1

وذلك تكون واجهة اللغة العربية قد أصبحت جاهزة.

الآن لنقم بدعم لغة أخرى للتطبيق و لتكن اللغة الانجليزية و ذلك باتباع الخطوات التالية:

  1. من نافذة الخصائص للنافذة Form1 ، نختار الخاصية Language و نغير قيمتها من Arabic إلى English
  2. نغير قيم الخصائص للنافذة Form1 كما يلي (لاحظ الشكل بعد تطبيق الخطوات):
  •       أ. Text: نكتب Main Window
  •      ب. RightToLeft: نختار No
  •      ت. RightToLeftLayout: نختار False

3. نغير قيم خصائص button1 كما يلي:

  •       أ. Text: نكتب Click Here

win2

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

خاطرة في تصميم التوابع Methods

هذا الكود مقتبس من كتاب مايكروسوفت Programming in C#. في هذا الكود فقط أود أن أتطرق إلى نقطة وهي أيّ (بتشديد الياء) التابعين أفضل من حيث البيانات (البرامترات) الممررة إليه؟

سأترك لك أولا وقت للتفكير،،

//LISTING 1 Passing a complete customer to a method

public Distance CalculateDistanceTo(Customer customer)

{

       Distance result = … // Some difficult calculation that uses customer.Address

       return result;

}

 

//LISTING 2 Passing only an address to a method

public Distance CalculateDistanceTo(Address address)

{

       Distance result = … // Some difficult calculation that uses address

       return result;

}

لكن إن أردت إشارات لتساعدك على الإختيار بنفسك فلك ذلك، سأطرح عليك بعض النقاط

1. أيّ الكودين يعتبر أوضح و أسهل للفهم من حيث البيانات المطلوبة لإجراء عملية حساب المسافة؟

2. أيّ الكودين فيه سهولة في الصيانة مقارنة بالآخر؟ أو بمعنى آخر أي الكودين يمكننا استخدامه أكثر من الآخر دون إجراء تعديلات؟ مرة أخرى ركز على البيانات (البرامتر) الممرر لكلا التابعين.

طبعا الإجابة على كلا السؤالين هو الكود الثاني.

بالنسبة للسؤال الأول،،

طبعا الكود الثاني أوضح وأسهل للفهم وذلك لأنه واضح من حيث متطلبات عمله فهو يطلب عنوان حتى يقوم بعملية حساب المسافة، في حين أن التابع الأول مبهم، فأنت ببساطة لا يمكنك استنباط أي البيانات التي يحتاجها التابع من الكائن من صنف Customer للعمل. بمعنى آخر لا تعلم أي البيانات المجودة داخل هذا الكائن من صنف Customer التي سوف يعتمد عليها في تقرير المسافة ربما يكون العنوان وقد يكون رمز المنطقة Postcode أو رمز الهاتف لتحديد المدينة أو…

قد يتبادر إلى ذهنك وما المشكلة في ذلك؟ لنفترض أنك تريد حساب المسافة لكل الزبائن المعروضين في جدول للزبائن الذين أجروا عملية شراء خلال الشهر الماضي في أحد واجهات لتطبيقك الجميل. طبعا الجدول لن يحتوي جميع معلومات الزبائن وإنما يعرض فقط بعض المعلومات عنهم. عندما تريد أن تحسب المسافة لزبون معين ستضطر عندما تستخدم التابع الأول لتأمين معلومات الزبون كاملة من قاعدة البيانات قبل تمريرها للتابع الأول لتتم عملية الحساب، بينما التابع الثاني لا يتطلب منك سوى العنوان والذي في أغلب الظن قد يكون متوفر ولا تحتاج إلى الاستعلام عنه من قاعدة البيانات. على كل إن لم تقتنع فلا مشكلة فالسبب الثاني سيكون كفيل بتبيهك إلى أمر أكثر أهمية والذي ستخلص من خلاله إلى أن تصميم الكود الثاني هو الأفضل بلا منازع.

بالنسبة للسؤال الثاني،،

لنفترض بعد مدة من الزمن تم التعديل على الصنف Customer ليحتوي حقل جديد WorkAddress مالذي سوف يحدث؟! لن تكون قادرا على استخدام التابع الأول لحساب المسافة باستخدام الحقل الجديد WorkAddress. أليس كذلك؟! ومع ذلك إن ألححت بمقدرتك على استخدام التابع الأول سيتطلب منك تعديل التابع الأول حتى يتثنى لك حساب المسافة لكل من Address و WorkAddress. لن أتطرق إلى كيفية التعديل، إذا أنه ومع الشروع بالتعديل ستكتشف العديد من المشاكل الأخرى. في حين وبكل سهولة يمكنك حساب المسافة للحقل الجديد WorkAddress بتمريره كبرامتر إلىه. حالة أخرى توضح مدى المشاكل التي يمكن أن تحصل فقط جراء سوء تصميم التابع الأول. لنقل أننا أردنا استخدام التابع مع مشروع آخر أو مع صنف آخر مثل Student، مرة أخرى لا يمكنك استخدام التابع الأول حيث أن Customer غير Student وبالتالي سيتطلب إجراء تعديلات ليتلائم التابع الأول مع الصنف الجديد Student. بينما لو استخدمنا التابع الثاني لن نواجه أي من المشاكل السابقة وعلى العكس ستشعر بمتعة حسن تصميم التابع.

الخلاصة: ان التابع الثاني أفضل من التابع الأول فهو سهل الفهم وأيضا لا يتطلب عملية تعديل على أقل تقدير للحالات آنفة الذكر.

نمط التصميم سنجلتون (الوحداني) Singleton Design Pattern

 

في هذه المقالة القصيرة سوف نتعرف على نموذج التصميم سنجلتون (تعني الوحيد من نوعه)، وهذه فعلا مفهوم نمط التصميم الذي سوف نتعرف إليه. الفكرة من هذا النمط هو تشيد أو بناء صف (كلاس) يكون وحيد ولا يمكن إيجاد سوى نسخة وحيده منه. يستخدم نمط التصميم هذا عندما يكون لدينا بيانات ثابتة ومشتركة في البرنامج الواحد. ربما يتبادر إلى ذهنك الآن أن هذا ممكنا باستخدام الصفوف الستاتيكية، وهذا كلام صحيح إذ أنه يمكنك استخدام الصفوف الستاتيكية للإحتفاظ بنسخة وحيدة من البيانات ومشاركتها بين جميع صفوف أو وحدات البرنامج دون الحاجة ولا حتى المقدرة على انشاء عدة نسخ منه. لكن ليس هذا هدف هذه المقالة ، هدف هذه المقالة هو التعرف على كيفية بناء صف عادي (ليس ستاتيكي) لتحقيق شيء مماثل للصفوف الستاتيكية وزيادة. الزيادة التي أعنيها هنا هي أن بناء صف عادي سوف يقدم لك مزايا لا تتوفر في الصفوف الستاتيكية. أرجوا أن أكون باختصار قد قدمت لك فكرة نمط التصميم "الوحيد" سنجلتون. الآن سوف نبدأ التعرف كيف نحقق ذلك برمجيا باستخدام لغة السي شارب. لاحظ كود 1 الذي يوضح الهيكل البدائي لإنشاء صف من نمط التصميم سنجلتون. تم تعريف الباني "constructor" بأنه خاص حتى لا يستطيع أحد إنشاء نسخة منه باستدعاء البناني ولو حتى مرة واحدة من خارج الصف. طبعا حاليا الصف بصيغته الحالية لن يمكن أحد من إنشاء نسخة منه بسبب التحفظ على البناني للإستخدام الداخلي ضمن نفس الكلاس فقط.

كود 1 الهيكل البدائي لانشاء صف من نمط سنجلتون

public class Singleton
{
    private Singleton() { }
}

الآن سوف نعرف خاصيّة تمكن مستخدم هذا الصف من التعامل مع نسخة من هذا الصف ولتهيئة نسخة من الصف داخليا في حال لم يتم ذلك بعد

كود 2: إضافة الباني وخاصية للحصول على نسخة وحيدة من الصف

1 public class Singleton
2 {
3      private static Singleton instance;
4      private Singleton() { }
5
6      public static Singleton Instance
7      {
8           get
9           {
10              if (instance == null)
11              {
12                   instance = new Singleton();
13              }
14
15                  return instance;
16          }
17     }
18 }

والآن أصبح الصف شبه جاهز حيث أن الخاصية Instance سوف تكون بمثابة الواجهة للصفوف الأخرى. الخاصية Instance سوف تعيد نسخة من الصف الحالي Singleton في حال توفرها، وإن لم تتوفر ستقوم باستدعاء الباني ليتم بتجهيز نسخة من الصف وتمريرها. وبما أن نوع الحقل هو ستاتيك فسوف نضمن أن هذه القيمة ستكون وحيدة. مرة أخرى الصف شبه جاهز، لأن مازال هناك احتمال حدوث أكثر من نسخة من الصف في حالة multi-threading، حيث أنه من المحتمل أن يتم فحص الشرط instance == null في نفس الوقت من قبل أكثر من thread، وبالتالي هذا سيؤدي إلى إنشاء أكثر من نسخة من الصف. لحل المشكلة السابقة سيتم استخدام تقنية lock في السي شارب التي تضمن السماح لـ thread واحد فقط بعمل الفحص وإنشاء نسخة من الصف في حال أن ذلك لم يحدث سابقا. بعد التعديل الكود السابق، سيصبح الكود الجديد المبين في

1 using System;
2
3 public class Singleton
4 {
5      private static object syncRoot = new Object();
6      private static Singleton instance;
7      private Singleton() { }
8
9      public static Singleton Instance
10    {
11         get
12         {
13               if (instance == null)
14               {
15                     lock (syncRoot)
16                     {
17                          if (instance == null)
18                          {
19                               instance = new Singleton();
20                           }
21                      }
22                }
23
24                return instance;
25          }
26     }
27 }

أصبح الكود الآن آمن للإستخدام مع multi-threads، لاحظ السطر 13 و 15، في هذه الحالة سوف يتم السماح لـ thread واحد فقط بالعبور وإنشاء نسخة من الصف في حال أن ذلك لم يحدث سابقا. قد تتساءل ما الفائدة من وجود شرط الفحص في السطر 13 وذلك لعدم السماح بتعطيل threads ، حيث أن بدون هذا الشرط سيؤدي إلى تنفيذ أمر القفل (السطر 14) كل مرة يتم فيها استدعاء الخاصية وبالتالي سيؤدي إلى توقف الـ threads الأخرى (إن وجدت) عن العمل ريثما يتم تحرير القفل. أخيرا قد تتساءل حسنا فما الفائدة من تكرار شرط الفحص في السطر 17، لأنه إذا فرضنا أن أكثر من thread استطاع اجتياز الشرط الأول (طبعا هذا وارد الحدوث في المرة الأولى التي يتم فيها استخدام الصف) وبالتالي ستقوم الـ thread الأولى بإنشاء نسخة من الصف بينما تنتظر الـ thread الأخرى تحرير القفل لتقوم هي مرة أخرى بإنشاء نسخة جديدة ثانية، وهكذا. لتجنب هذا الأمر فإنه سوف يتم إعادة فحص الشرط للتأكد أنه لم يقم thread سابق بإنشاء نسخة من الصنف قبل ذلك. مرة أخرى هذا وارد الحدوث فقط في حال multi-threading ولا يوجد نسخة للصف سابقا.

أرجوا أن أكون قد وفقت في الشرح

أضطررت لإستخدام المصطلحات الانجليزية لتفادي الوقوع في المشاكل جراء الترجمة لأن الأكثر يتبع المصطلحات الانجليزية.

المراجع:

Implementing Singleton in C#: https://msdn.microsoft.com/en-us/library/ff650316.aspx

‘Target’ Attribute in WPF

This short article is going to explain the usefulness of ‘Target’ attribute in WPF. Keep in your mind is that Target attribute is used to set focus on an element in the WPF Window when the access key associated with the element is hit. In other words, Target attributes is used to set focus on another element associated with the current element when the access key is hit. For example, let us build a Window with Label and TextBox

clip_image002

<Window x:Class="WPFTester.BindingAndReference"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008&quot;

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006&quot;

        xmlns:local="clr-namespace:WPFTester"

        mc:Ignorable="d"

        Title="BindingAndReference" Height="300" Width="300">

    <StackPanel>

        <Label FontSize="16">Enter text:</Label>

        <TextBox x:Name="txtName" FontSize="16"></TextBox>

    </StackPanel>

</Window>

Now, we are going to create an access key (for example, Alt + t) which when it is hit, the cursor will be set in the text box directly. To do that we need to set the attribute ‘Target’ of the label, so that when Alt + t is hit, the focus will be on the TextBlock, so that the user can enter his or her name. XAML code will be modified to look like follow:

<Window x:Class="WPFTester.BindingAndReference"

        

       

    <StackPanel>

        <Label Target="{Binding ElementName=txtName}" FontSize="16">Enter _text:</Label>

        <TextBox x:Name="txtName" FontSize="16"></TextBox>

    </StackPanel>

</Window>

The modified or added code has been highlighted, the rest of the previous code is intact. The label is bound to the TextBox through Target attribute of the label. Note that ElementName refers to the element name associated with its label. To set a name to a control, use ‘x:Name’. Note, to set the access key use the symbol ‘_’ before the letter that you need to associate it with Alt combination.

clip_image004

Welcome to jQuery world!

This is my first article about jQuery. jQuery is simply JavaScript. The idea of jQuery isjquery_bumper-sh-600x600 writing less code to do more actions that would be longer by using standard JavaScript.

Firstly, to write jQuery code, you need to embed jQuery library. There are several ways to do that either by downloading the library from www.jquery.com website, then include it in your built website, or you can refer to it online as Microsoft and Google have provided jQuery library by their Websites.

If you include the library in your website, the code will look like the follow:

إقرأ المزيد

var vs. dynamic in C#

This is going to be a very short article talking about var vs dynamic features in C#. var is a new keyword added to .NET 3.5. var is a new way to declaring variables in C#. In other words, instead of specifying the type of the defined variable, the compiler is going to figure out the data type of the declared variable.

For example, you can use var deceleration keyword instead of using int in the following lines.

  1.  int x = 3;
  2.  var y = 3;

For your information, both previous lines are exactly the same. Where the first line was written using int keyword to declare an integer variable; whereas, the second line used var to let the compiler figure out the value type. Both of the variables, x and y are integers variables.

This is helpful especially in complicated declared types when using LINQ.

dynamic was introduced in C# 4.0 where it is a new way to declare objects and variables. The main objective is that to let the compiler ignore type checking during the compile time, and force it during the run-time. If you rewrite the previous example using dynamic, you will not notice any difference in the execution.

  1.  dynamic z = 3;

The only difference is that the compiler has no idea about the data type of the variable z during the compile-time, but during the run-time. This is why it is called late bound.  This could be useful in certain matters where you need to deal with interoperability for example.

To recap, var is considered as early binding where data type determination and method lookup are done during compile-time; whereas, dynamic is a late bound where data type and method lookup are carried out through the run-time using reflection. Thus, we can conclude syntax checking happens during compile-time and typos must be corrected before program execution when using var; while dynamic syntax could throw errors during the run-time as syntax checking never happens before execution. To illustrate the last point, consider the following example:

  1. var s1 = “Hello”;
  2. int n1 = s1.Leng;
  3. dynamic s2 = “Hello”;
  4. int n2 = s2.Leng;

notice that the property name is wrong on purpose, Line 1 has a syntax error as type checking took place during the compile time. Unlike var, using dynamic is not going to highlight any syntax error in compile-time (Line 4 has no problem during compile-time), but an error will be thrown during the run-time after type checking takes place and property lookup-operation fails to find a property with the name ‘Leng’.

%d مدونون معجبون بهذه: