امروز چون فرصت ویرایش و انتشار چندتا مطلبی که توی ویرگول گذاشتم رو ندارم تصمیم گرفتم تا چند تا نکته از داخل سی شارپ بنویسم.
موضوع اولی که میخوایم امروز باهاش سر و کله بزنیم این هستش که چطوری میتونیم آبجکتی رو ایجاد کنیم بدون این که بخوایم سازنده کلاس اون رو صدا بزنیم!
قبل از این که بخوایم ادامه بدیم بهتره ببینیم اصلا برای چی باید این کار رو انجام بدیم؟! یه مثال ساده ای که بخوایم بزنیم مواقعی هستش که میخوایم تا عملیات deserialization رو انجام بدیم, در این مواقع چون باید Property ها رو به صورت دستی مقدار دهی کنیم نیازی به صدا زدن سازنده نیست, و عملا سرباز اضافی محسوب میشه(فرض کنید میخواین یه رشته از Json رو deserialize کنید)
هدف ما ایجاد یک آبجکت از کلاس User هستش و میخوایم سازنده این کلاس اجرا نشه در نتیجه اگه توی محیط کنسول کار کنیم نباید عبارت Constructor توی خروجی چاپ بشه. برای این منظور از متد GetUninitializedObject که در فضای نام System.Runtime.Serialization قرار داره استفاده میکنیم:
نتیجه اجرای کد بالا یک آبجکت از نوع کلاس User هستش که سازنده اون اجرا نشده هستش و خط Console.WriteLine(o) چیزی که در خروجی چاپ میکنه متن User خواهد بود که نشون دهنده Type آبجکت هستش.
نقطه مقابل این متد برای ایجاد آبجکت ها در زمان اجرا یا Run-Time متد Activator.CreateInstance هستش که باعث صدا زدن Constructor میشه. دلیل این که از روش اول برای ایجاد آبجکت در زمان اجرا میکنیم سرعت بالاتر اون هستش که برای مثال بالا در صورتی که از GetUninitializedObject استفاده کنیم(روی سیستم من) در حدود 12 نانوثانیه زمان لازم بود تا آبجکت ایجاد بشه در صورت استفاده از Activator.CreateInstance 490 نانو ثانیه زمان لازم بود و در صورتی که آبجکت رو به صورت مستقیم و به شکل زیر ایجاد کنیم:
var u = new User();
متوسط زمان لازم حدود 300 نانو ثانیه بود.