r00tkit
یک شنبه 12 اردیبهشت 1389, 19:33 عصر
سلام قصد دارم در مورد نوع dynamic در سی شارپ کمی بنویسم:خجالت: (اگه اشکال داشت که داره :افسرده:به بزرگی خودتون ببخشید:بوس:)
اگه دوستان استقبال کنند ادامه می دم:قلب:
C# یه زبان برنامه نویسی type-safe هستش یعنی همه عبارات به یک نمونه از یک تایپ تبدیل شده و کامپایلر فقط کدی رو تولید می کنه که در حال انجام کاری باشه که برای ان تایپ خاص معتر باشه .سود زبان های type-safe بر زبان های non-type-safe این است که اکثر اشکالات برنامه نویس در زمان کامپایل مشخص شده،و این باعث می شه از درست بودن کد قبل از تلاش برای اجرا مطمئن باشیم.
زبان های زمان کامپایل معمولا کد های سریع و کوچک تری درست می کنند به این خاطر که در زمان کامپایل کامپایلر اطلاعات بیشتری درست و به IL وmetadata تبدیل می کنه
با این وجود بعضی مواقع هستش که برنامه می خواد بر روی اطلاعاتی کار کنه که فقط در زمان اجرا در دست رس هستش
زمانی که شما از زبان های type-safe استفاده می کنید(مثل C#) برای انجام فعل انفعال بر روی این چنین اطلاعاتی (همون هایی که تو زمان اجرا معلوم می شدن) سینتکس بد جوری زمخت می شه مخصوصا" وقتی با string ها ی زیاد کار می کنید و کارایی افت می کنه. در سی شارپ این اتفاق زمانی رخ می ده که شما دارید با reflection کار می کنید.
با این وجود بعضی از developer ها از C# استفاده می کنن برای ارتباط با componet هایی که در C# پیاده سازی نشده اند بعضی از این ها می تونه زبان های dynamic تحت .net باشه مثل Ruby و Python یا اشیای COM که از اینترفیس IDispatch پشتیبانی می کنند(که ممکن هستش در native c/C++ پیاده سازی شده باشند) یا اشیای DOM(HTML Document Object Model)( که با زبان/ تکنولوژِی های مختلف پیاده سازی می شن) استفاده از اشياء HTML DOM مخصوصا" در ساخت برنامه های Silverlight مفید هستش.
----------------
برای اسان کردن کار developer هایی که از reflection استفاده می کنن برای کار با component دیگه، کامپایلر C# یه راهی رو پیشنهاد می ده برای mark کردن نوع عبارات به dynamic ، شما حتی می تونین نیجه ی عبارات رو داخل متغیر هایی از نوع dynamic قرار بدین
dynamic expression/variable می تونه سپس استفاده بشه برای invoke کردن اعضاء عضو مثل field,
property/indexer, method, delegate, unary/binary/conversion operators
زمانی که کد شما در عبارات یا متغیر های dynamic عضوی رو فراخوانی می کنه کامپایلر کد خاص IL لی رو تولید می کنه که ان عمل رو تشریح می کنه. که این کد به اسم payload شناخته می شه. در زمان اجرا payload نوع دقیق عمل رو برای اجرا مبني بر نوع واقعی object که حالا به عنوان dynamic expression/variable شناخته می شه
نگاه کنید:
Private static class DynamicDemo {
public static void Main() {
for (Int32 demo = 0; demo < 2; demo++) {
dynamic arg = (demo == 0) ? (dynamic) 5 : (dynamic) "A";
dynamic result = Plus(arg);
M(result);
}
}
static dynamic Plus(dynamic arg) { return arg + arg; }
private static void M(Int32 n) { Console.WriteLine("M(Int32): " + n); }
private static void M(String s) { Console.WriteLine("M(String): " + s); }
}
خروجی :
M(Int32): 10
M(String): AA
ادامه دارد ... (خسته شدم )
-------------------
منظور ironruby و ironpython هستش
اگه دوستان استقبال کنند ادامه می دم:قلب:
C# یه زبان برنامه نویسی type-safe هستش یعنی همه عبارات به یک نمونه از یک تایپ تبدیل شده و کامپایلر فقط کدی رو تولید می کنه که در حال انجام کاری باشه که برای ان تایپ خاص معتر باشه .سود زبان های type-safe بر زبان های non-type-safe این است که اکثر اشکالات برنامه نویس در زمان کامپایل مشخص شده،و این باعث می شه از درست بودن کد قبل از تلاش برای اجرا مطمئن باشیم.
زبان های زمان کامپایل معمولا کد های سریع و کوچک تری درست می کنند به این خاطر که در زمان کامپایل کامپایلر اطلاعات بیشتری درست و به IL وmetadata تبدیل می کنه
با این وجود بعضی مواقع هستش که برنامه می خواد بر روی اطلاعاتی کار کنه که فقط در زمان اجرا در دست رس هستش
زمانی که شما از زبان های type-safe استفاده می کنید(مثل C#) برای انجام فعل انفعال بر روی این چنین اطلاعاتی (همون هایی که تو زمان اجرا معلوم می شدن) سینتکس بد جوری زمخت می شه مخصوصا" وقتی با string ها ی زیاد کار می کنید و کارایی افت می کنه. در سی شارپ این اتفاق زمانی رخ می ده که شما دارید با reflection کار می کنید.
با این وجود بعضی از developer ها از C# استفاده می کنن برای ارتباط با componet هایی که در C# پیاده سازی نشده اند بعضی از این ها می تونه زبان های dynamic تحت .net باشه مثل Ruby و Python یا اشیای COM که از اینترفیس IDispatch پشتیبانی می کنند(که ممکن هستش در native c/C++ پیاده سازی شده باشند) یا اشیای DOM(HTML Document Object Model)( که با زبان/ تکنولوژِی های مختلف پیاده سازی می شن) استفاده از اشياء HTML DOM مخصوصا" در ساخت برنامه های Silverlight مفید هستش.
----------------
برای اسان کردن کار developer هایی که از reflection استفاده می کنن برای کار با component دیگه، کامپایلر C# یه راهی رو پیشنهاد می ده برای mark کردن نوع عبارات به dynamic ، شما حتی می تونین نیجه ی عبارات رو داخل متغیر هایی از نوع dynamic قرار بدین
dynamic expression/variable می تونه سپس استفاده بشه برای invoke کردن اعضاء عضو مثل field,
property/indexer, method, delegate, unary/binary/conversion operators
زمانی که کد شما در عبارات یا متغیر های dynamic عضوی رو فراخوانی می کنه کامپایلر کد خاص IL لی رو تولید می کنه که ان عمل رو تشریح می کنه. که این کد به اسم payload شناخته می شه. در زمان اجرا payload نوع دقیق عمل رو برای اجرا مبني بر نوع واقعی object که حالا به عنوان dynamic expression/variable شناخته می شه
نگاه کنید:
Private static class DynamicDemo {
public static void Main() {
for (Int32 demo = 0; demo < 2; demo++) {
dynamic arg = (demo == 0) ? (dynamic) 5 : (dynamic) "A";
dynamic result = Plus(arg);
M(result);
}
}
static dynamic Plus(dynamic arg) { return arg + arg; }
private static void M(Int32 n) { Console.WriteLine("M(Int32): " + n); }
private static void M(String s) { Console.WriteLine("M(String): " + s); }
}
خروجی :
M(Int32): 10
M(String): AA
ادامه دارد ... (خسته شدم )
-------------------
منظور ironruby و ironpython هستش