سلام و عرض وقت بخیر خدمت اساتید :n40:
چرا باید هم کلاس و هم متد اجبارا Static باشند؟
کلمه کلیدی this دقیقا به چه منظور است؟
:n41:
Printable View
سلام و عرض وقت بخیر خدمت اساتید :n40:
چرا باید هم کلاس و هم متد اجبارا Static باشند؟
کلمه کلیدی this دقیقا به چه منظور است؟
:n41:
........................... .
.............................. .
کلمه کلیدی this برای اشاره به فرم جاری و توابع آن استفاده میشود...
سلام
از نظر تئوری متد باید static باشد ولی اجبار static بودن کلاس نوعی محکم کاری و تمیز کاری است که کارها مخلوط نشوند.نقل قول:
نوشته شده توسط Life24
اتفاقاً لغو اجبار static بودن کلاس جزء مواردی است که مدت هااست [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ] و رای های مثبت و منفی هم گرفته ... که مهم در جواب شما آن است که از نظر تئوری میشود کلاس static نباشد ولی بحث مزیت و ایراد آن خارج از حوصله من و شماست و ارزشی هم ندارد ...
ولی static بودن متد واجب است، چون تابع باید بدون نیاز به نمونه سازی کلاس و بطور مستقیم قابل استفاده باشد.
اجازه دهید با مثالی مطلب را دنبال کنیم:
در واقع خط int a یک جور کوتاه نویسی خط int b است، کامپایلر فقط برای راحتی ما خط int a را میپذیرد و جای آن دقیقا خطی مشابه int b قرار میدهد.کد:public class Class1
{
public string x;
}
public static class Extensions
{
public static int ToInt32(this Class1 instance)
{
return int.Parse(instance.x);
}
}
public class Program
{
public static void Main(string[] args)
{
var c = new Class1() { x = "123" };
int a = c.ToInt32();
int b = Extensions.ToInt32(c);
}
}
Extension فقط یک جور خلاصه نویسی در استفاده از توابع static است.
کلمه this در اینجا دو جنبه دارد ...نقل قول:
نوشته شده توسط Life24
الف) از جنبه شهودی نشان میدهد که متغییر اول ما جای کلمه this را گرفته و مشابه آن عمل میکند.
یعنی اگر تابع ما درون خود کلاس تعریف میشود این متغیر اولی همان this شی جاری میبود.
(((در واقع تمام توابع عضو کلاس هم یک متغییر اولیه مخفی که همان this باشد را در ورودی دریافت میکنند.)))
در مثال قبل اگر تابع ToInt32 ما داخل خود Class1 میبود مگر کدش شبیه این نمیشد:
خوب شباهت دو کد را مشاهده کنید ... متغییر اولی در مثال static دقیقاً کار this را در توابع عضو انجام میدهد.کد:public class Class1
{
public string x;
public int ToInt32()
{
return int.Parse(this.x);
}
}
ب) ولی از جنبه عملی نوشتن این this کاربرد مهمی دارد و در واقع خلاصه نویسی برای [System.Runtime.CompilerServices.ExtensionAttribute] است.
در واقع کامپایلر [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ] باز هم کد ما را کوچک میکند و خودش کد زیر را کامپایل نهایی به IL میکند.
به عنوان نمونه اگر به طریقه تعریف Extension توابع در VB مراجعه کنید، متوجه میشوید که باید دقیق از attribute فوق استفاده کنید.کد:public static class Extensions
{
[System.Runtime.CompilerServices.ExtensionAttribute]
public static int ToInt32(Class1 instance)
{
return int.Parse(instance.x);
}
}
البته سی شارپ اجازه کدنویسی مستقیم به این صورت را نمیدهد
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
موفق باشید.