PDA

View Full Version : extension methods چيست؟



rahe behtari hast
شنبه 11 آذر 1391, 13:52 عصر
همه ي متدها داخل كلاسها قرار دارن و ما براي دسترسي بهشون از اين روش استفاده ميكنيم:

int a= 3a
string b= convert.tostring(a)a

اما يك سري متد وجود دارن كه روي متغييرها اعمال ميشن
مثل

int a=3a
string b= a.tostring()a

اين متدها چه اسمي دارن؟
چرا داخل كلاس خاصي نيستند؟ چرا وروديشون قبل از خودشون اومده!
extension methods به همينها ميگن؟

hakim22
شنبه 11 آذر 1391, 14:25 عصر
خیر به اینها نمیگویند !
در زبانهای دات نت انواع داده ای خودشان یک کلاس هستند . یعنی در اینجا int خالی فقط یک نوع داده ای نیست. بلکه یک کلاس با ده ها متد است که شما هنگام تعریف int a=3 آن را میسازید و فقط فرقش این است که برای این نمونه سازی نیازی به کلمه ی کلیدی new ندارید.

حالا هر وقت بخواهید به این نوع کلاس ها تابع یا متد جدیدی اضافه کنید از Extention Method استفاده کنید.

Extension methods به شما اجازه میدهند که به یک کلاس ( یا type) یک متد جدید اضافه کنید بدون این که نیاز باشد از آن کلاس ارث بری کنید یا حتی کد را Recompile کنید.
بیشترین استفاده ای که من ازش دیدم در ساختن کانورت های جدیدی بجای ToString یا امثال آن بوده است.
از Extention Method برای برای افزودن قابلیت های جدید به انواع داده استفاده میشود. مثلا شما در برنامه تان از DateAndTime استفاده می کنید و میخواهید همیشه و هرجا که لازم شده تاریخ میلادی بدست آمده به صورت شمسی نمایش داده شود. شما می توانید یک تابع بسازید که این تاریخ را هرجا که لازم شد به شمسی تبدیل کنید یا یک متد جدید به این نوع داده ای با استفاده از Extention Method اضافه کنید تا در همه ی برنامه متد ToPersianDate سوار آن شده باشد و به راحتی این کار صورت گیرد.

---

rahe behtari hast
شنبه 11 آذر 1391, 14:50 عصر
در زبانهای دات نت انواع داده ای خودشان یک کلاس هستند

آقا ممنون بخاطر اطلاعات كامل و جامعي كه دادي.
اگه بتوني اين موضوع رو واسه ي من جا بندازي يك دنيا ممنونت ميشم!

چرا بعضي وقتيها new استفاده ميشه بعضي وقتها نه

button button1 = new button();a

در اين كد قسمت سمت چپ يك آبجكت تعريف ميكنه (كه شامل يك نسخه از تمام پروپرتيهاي كلاس دكمه هست). قسمت سمت راست چي كار ميكنه؟

بعضي وقتها هست ما از هر دو حالت ميتونيم استفاده كنيم مثل:

List<int> a = new List <int>;a
f
List<int> a;a

dيك جايي هم مثل همون كلاس int هيچوقت نياز به new نداره.

اين جاها هم از new استفاده ميشه:


ArrayList complexList = new ArrayList();a
complexList.Add(new DateTime(2011,1,1));a

يا مثلا در لينكيو:

Select(o => new { c.Family , o.OrderID })a


اين new دقيقا چيه؟

hakim22
شنبه 11 آذر 1391, 15:21 عصر
هر شی یک متد سازنده Constructor داره . مثلا اگر به کد زیر یک فرم بری یک متد در همون ابتدای کلاس همنام با اسم فرم هست که توش یک متد اجرا میشه با نام InitializeComponents

متدهای سازنده یک کلاس درست بعد از اینکه شما دستور new رو در مورد یک کلاس اجرا می کنید عمل می کنند. و هر کدی درونش بنویسید میتونه برای تنظیم خصوصیات اون کلاس مورد استفاده قرار بگیره .

مثلا شما می توانید رنگ پس زمینه یا فونت یک فرم رو در متد سازنده قرار بدید و فارق از اینکه فرم رو Load کنید یا نه هر جا دستور New داده باشید برای نمونه سازی از اون فرم خصوصیات اون تنظیم میشوند . حا لا شاید در مورد یک فرم استفاده از این قابلیت کمی بی معنی به نظر برسه .

کار عملگر new اینه که خصوصیات یک کلاس رو تنظیم کنه و در یک فضای خالی در حافظه برای نگاه داشتن مقدار درونشون ایجاد کنه. اگر شما از عملگر new استفاده نکنید این فضای خالی در حافظه شکل نمیگیره و اصطلاحا گفته میشه متغیر در حالت null یا همون پوچ قرار داره تا زمانی که یا یک مقداری به اون اختصاص بدید یا از کلمه ی کلیدی برای ساختن یک نمونه استفاده کنید.

به نظر من شما با تعریف کلاس مشکل دارید.
یک کلاس چیزی است که یک شی رو توصیف میکنه و خود اون شی نیست.
مثلا کلاس با نام student میسازد که شامل نام و نام خانوادگی و نمره کلاسی یک دانش آموز است.
این مثل این است که شما یک فرم با یک سری جای خالی میسازید که تویش نوشته باشد ، نام ، نام خانوادگی و نمره.

حالا باید مقادیر رو یکی یکی پر کنید. برای اینکار شما اول با دستور new یک فرم جدید برای هر دانش آموز میسازید و مقادیر هر خصوصیت را یکی یکی تنظیم می کنید.

rahe behtari hast
شنبه 11 آذر 1391, 15:52 عصر
متدهای سازنده یک کلاس درست بعد از اینکه شما دستور new رو در مورد یک کلاس اجرا می کنید عمل می کنند. و هر کدی درونش بنویسید میتونه برای تنظیم خصوصیات اون کلاس مورد استفاده قرار بگیره .

آقا دستت درد نكنه خيلي خوب توضيح ميدي

ببخشيد من سماجت ميكنم. آخه اين موضوع تا درست برام جا نيوفته آروم نميشم. يك بار براي هميشه دقيق بايد بفهممش

ببين من اينجوري موضوع رو گرفتم

ما اول يك آبجكت درست ميكنيم
بعد براي يك كلاس new رو اجرا ميكنيم
با اين كار از اون كلاس تمام پروپرتيهاش يك نسخه كپي ميكنه و ميريزه تون اون آبجكت

خب تا اينجا همه چيز اوكيه
اما يك چيز اين وسط اضافه است
من تا حالا فكر ميكردم ما وقتي ميگيم

button button1;a

يعني يك آبجكت ساختيم كه داخلش يك نسخه از پروپرتيهاي كلاس دكمه وجود داره
اما اين طور كه شما ميگين وقتي new اتفاق ميافته اون نسخه ايجاد ميشه

پس سازنده هاي سي شارپ ميتونستن اين طور كار كنن

button1=new button();a

چه لزومي داره همون موقع كه داريم آبجكت رو ميسازيم اسم كلاس رو بياريم و بنويسيم

button button1=new button();a

hakim22
شنبه 11 آذر 1391, 17:40 عصر
این دیگه قانون در #C است که اول نوع متغیر باید تعریف بشه بعد اسمش.
در ضمن علامت = در #C یعنی راست رو بریز توی چپ .
در حالتی که نوع سمت چپ مشخص نباشه اینکار خیلی پیچیده میشه و زبان #C خودش باید تشخیص بده نوع متغیر چیه تا مقادیر سمت راست رو توش جایگذین کنه .
این کار زبان رو برای ترجمه سخت تر میکنه ( در بعضی زبان ها تشخیص نوع با خود مترجم است)

البته در بعضی موارد میتوانید از نوع کلی var برای تعریف استفاده کنید و از #C بخواهید خودش نوع رو تشخیص بده ( در LINQ اینجوریه) اما خیلی به کار نمیاد چون فقط با نوع داده ها ( int ، string , double ) و اینها کار میکنه و بعضی متغیرهای خاص دیگه

returnx
شنبه 11 آذر 1391, 18:31 عصر
نمیدونم شما با مفهوم اشاره گر آشنا هستید یا نه !؟ در C#‎‎‎ مدیریت اشاره گر ها به عهده کامپایلر هست و نه برنامه نویس اما وقتی شما چنین کدی مینویسید چه اتفاقی میفته:
مثلا :
button i_button=new button();

زمانی که مینویسد [button i_button/CSHARP] در واقع شما یک اشاره گر از نوع کلاس button می سازید ، اما این اشاره گر به کجا اشاره می کنه؟! در واقع تا زمانی که شما از new استفاده نکنید به جای خاصی اشاره نمیکنه و به اصطلاح رو هواست!! دقیقا این کد مطابق این کد در C++‎‎‎ هست:
QPushButton*i_button;
وقتی که شما مینوسید new button(); در این زمان هست که اشاره گر شما به کلاس button اشاره میکنه و تابع سازنده کلاس button اجرا میشه و مقادیر اولیه مورد نیاز رو مقدار دهی میکنه...

پس سازنده هاي سي شارپ ميتونستن اين طور كار كنن

button1=new button();a

شما میتونید به این صورت هم بنویسید : (تفاوت خاصی نداره)
[CSHARP]button i_button;
i_button=new button();
یا هر وقت و هر جا که خاستید new کنید به شرط اینکه متغیرتون (درست ترش ، اشارگرتون) در دسترس باشه...

مهرداد صفا
شنبه 11 آذر 1391, 18:36 عصر
آقا دستت درد نكنه خيلي خوب توضيح ميدي

ببخشيد من سماجت ميكنم. آخه اين موضوع تا درست برام جا نيوفته آروم نميشم. يك بار براي هميشه دقيق بايد بفهممش

ببين من اينجوري موضوع رو گرفتم

ما اول يك آبجكت درست ميكنيم
بعد براي يك كلاس new رو اجرا ميكنيم
با اين كار از اون كلاس تمام پروپرتيهاش يك نسخه كپي ميكنه و ميريزه تون اون آبجكت

خب تا اينجا همه چيز اوكيه
اما يك چيز اين وسط اضافه است
من تا حالا فكر ميكردم ما وقتي ميگيم

button button1;a

يعني يك آبجكت ساختيم كه داخلش يك نسخه از پروپرتيهاي كلاس دكمه وجود داره
اما اين طور كه شما ميگين وقتي new اتفاق ميافته اون نسخه ايجاد ميشه

پس سازنده هاي سي شارپ ميتونستن اين طور كار كنن

button1=new button();a

چه لزومي داره همون موقع كه داريم آبجكت رو ميسازيم اسم كلاس رو بياريم و بنويسيم

button button1=new button();a

با سلام
در تکمیل گفته های دوست خوبم hakim22 اضافه کنم که ما همیشه نیاز نداریم یک شی جدید بسازیم. در یک مثال ساده شما وقتی که یک Rectangle جدید میخواهید به این صورت می نویسید:
Rectangle Rect1=new Rectangle....
حالا زمانی که ما یک مستطیل میخواهیم که ممکن است سطح یک فرم را شامل شود یا تمام صفحه نمایش را:
Rectangle Rect2 = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
از طرفی زمانی شما می خواهید یک کلاس پایه را به عنوان نوع متغیر در نظر بگیرید تا بتوانید اشیا مختلف را در آن نگهدارید:

Control control1;
if (value1 == 1)
{
control1 = new Button();
}
else
{
control1 = new Label();
}
در واقع در C# نوع متغیر باید روشن باشد حتی قبل از اینکه مقداری به آن داده شود شاید این موضوع به کامپایلر در تبدیل داده ها و یا به intellisense در تشخیص کمک میکند. البته در زبانهایی از قبیل vb6 و یا python به شکلی که گفتید عمل میشود.

شاه وفا ابالفضل