PDA

View Full Version : مفهوم get,set



abolfazlkaveh
چهارشنبه 24 مرداد 1386, 21:47 عصر
سلام
لطف کنید یه توضیحی در مورد مفهوم get,set و اینکه اصولا چه کاربردی داره؟
با تشکر

PC2st
چهارشنبه 24 مرداد 1386, 22:32 عصر
قبلش در مورد تفاوت خاصیت ها و فیلد ها یک توضیحی بدم:
1. برای خاصیت ها میتوان از اینترفیس استفاده کرد ولی برای فیلد ها نمیشه.
2. خاصیت ها میتوانند به اشیاء دیگر متصل (Bind) شوند، مثل وقتی که یک TextBox را به یک فیلد از جدول متصل میکنید.
3. خاصیت ها قابلیت Override شدن رو دارند ولی فیلد ها نه.

در خاصیت ها از دو کلمه کلیدی get و set استفاده میشه که کدهائی که درون بلاک get قرار دارند، زمانی اجرا میشوند که بخواهیم مقدار یک خاصیت را دریافت کنیم. و کدهائی که درون بلاک set قرار دارند زمانی اجرا میشوند که بخواهیم یک مقدار را درون خاصیت قرار دهیم.

توسط بلاکهای get و set میتوانیم دسترسی کاربر یا برنامه نویس یا دیگر اشیاء را محدود کنیم، مثلا اگر فقط بلاک get وجود داشته باشد، پس فقط میتوانیم یک مقدار را از آن دریافت کنیم، مثلا خاصیت Hello را در نظر بگیرید:


class Wellcome
{
public string Hello
{
get
{
return "Hello My Friend";
}
}
}

در خاصیت فوق، فقط بلاک get وجود دارد، پس میتوانیم بصورت زیر از آن استفاده کنیم:


Wellcome well = new Wellcome();
MessageBox.Show(well.Hello);

حال در کد زیر، اجازه قرار دادن یک مقدار در این خاصیت را نداریم:


Wellcome well = new Wellcome();
well = "Thanks"; //Error


در اینترفیس ها، میتوانیم مشخص کنیم که خاصیت به چه صورت باشد، مثلا:


interface Good
{
string Hello { get; }
}


پس اگر کلاسی از اینترفیس Good پیروی کند، باید بلاک get در خاصیت Hello پیاده سازی شده باشد، همچنین آن کلاس میتواند بلاک set را هم پیاده سازی کند، ولی بلاک set جزء اینترفیس نیست و فقط جزء پیاده سازی کلاس است.

و یک مورد خیلی مهم!
توجه: در حالت unsafe نمیتوان آدرس یک خاصیت را به یک اشاره گر نسبت داد. پس در اینصورت اگر بجای فیلد از خاصیت استفاده کنید، نمیتوانید به آدرس فیلد دسترسی داشته باشید.

این چیزهائی بود که به ذهنم رسید...

MH2538
چهارشنبه 24 مرداد 1386, 22:34 عصر
سلام
یکی دیگه از کاربردهای این دو مفهوم get و set در هنگام تعریف یک property است.
برای یک مثال عملی : یک usercontrol به پروژه اتون اضافه کنید و توی کد این usercontrol مد زیر رو بنویسید.


int Volume;
...
...
public int Volume
{
get { return Volume; }
set { Volume = value; }
}


بعد برنامه رو compile کنید.
در حالت design می تونید usercontrole خودتون رو ببنید.
اون رو به فرمتون اضافه کنید.
حالا به کد فرمتون برید و propertyهای این usercontrol را بیارید.
می بینید که property که شما تعریف کرده بودید اضافه شده است.
get مقدار property رو به شما بر میگردونه و set هم مقدار property رو که شما تنظیم کردید به usercontrol پاس می ده.

hdv212
پنج شنبه 25 مرداد 1386, 00:08 صبح
در ضمن با تغییر کد :

set
{
this.fieldName = value;
}

به این :


set
{
if(this.fieldName != value)
this.fieldName = value;
}

کدتون رو Optimize کنید. (نکته ی مهندسی نرم افزار)

omid_Ahmadi
پنج شنبه 25 مرداد 1386, 20:51 عصر
همواره این مورد باعث اپتیمایز شدن کد نمیشه، خیلی از شرایط تست برابر بودن دو نمونه از یک شئی سخت تر از انتساب اون هست.

موفق باشید

hdv212
پنج شنبه 25 مرداد 1386, 23:18 عصر
همواره این مورد باعث اپتیمایز شدن کد نمیشه، خیلی از شرایط تست برابر بودن دو نمونه از یک شئی سخت تر از انتساب اون هست.

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

تکنیک مورد نظر، برگرفته از کتاب Packt.Publishing.GDI.plus.Custom.Controls.with.Vis ual.C.Sharp.2005 است.

PC2st
جمعه 26 مرداد 1386, 00:13 صبح
همواره اینطور نیست، یک شیئی رو در نظر بگیرید که از یک struct خیلی بزرگی ساخته شده باشه! مجبورید که تک تک اعضای این شیئ رو با value مقایسه کنید تا ببینید یکی هستند یا خیر، چونکه struvt ها از نوع ارجاعی نیستند، وبرای اینکه بفهمیم دو شیئ از struct برابر هستند، مجبوریم که تک تک اعضا رو با هم مقایسه کنیم و این به صرفه نیست.

omid_Ahmadi
جمعه 26 مرداد 1386, 12:55 عصر
CLR برای آبجکتهایی که توی Heap قرار گرفتن، از Copy On Assignment استفاده نمی کنه. به همین دلیل هر قدر هم داده (و یا در حالت کلی، آبجکت) بزرگتر باشه ، استفاده از انتساب عادی (و Shallow Copy تا هم تا حدی) تاثیری در سرعت عملیات نداره، در صرتی که مقایسه در این حالتها بسیار زمانبر میشه.

گفته شما در مورد داده های Value Type، مثل ساختارها و یا برای Deep Copy در Reference Typeها صحت داده، اما نمیشه اون رو به صورت یه قانون کلی تعمیم داد.

موفق باشید

PC2st
جمعه 26 مرداد 1386, 14:22 عصر
در صرتی که مقایسه در این حالتها بسیار زمانبر میشه.
با این نکته یک سوال پیش میآد و آن اینکه،
یعنی برای مقایسه دو شیئ (ارجاعی) از آدرس انها در managed heap استفاده نمیشود؟
مثلا:


object A = 'a';
object B = A;
if (A == B) Console.Beep();

یعنی در کدهای فوق، اینطوری نیست که آدرسی که در A قرار داره، در B هم هست، پس با هم برابرند؟