PDA

View Full Version : موارد استفاده از get و set



چهارشنبه 26 شهریور 1382, 01:32 صبح
آقا ببخشیدا من نمیفهمم لزوم وجود get va setدر سی شارپ چیه
لطفا برای من توضیح بدید
ممنون :D :oops:

Abbas Arizi
چهارشنبه 26 شهریور 1382, 01:46 صبح
برای بوجود آوردن Property برای کلاسها در #C از set و get استفاده میشود.
کدی که در بلوک get قرار دارد موقع دسترسی به Proprty اجرا میشود و کد set در موقع تنظیم و مقداردهی آن.

Vahid_Nasiri
چهارشنبه 26 شهریور 1382, 02:57 صبح
لزوم...

برنامه نویسی یک هنر است!
هنر هم جدا از زیبایی نیست. می شود بجای get و set این خواص را از طریق یک تابع هم دریافت کرد ولی اینطوری زیباتر است! :oops:

در مورد کاربرد:

علاوه بر مواردی که دوستمان گفتند به این مقاله هم رجوع کنید:
مقدمه ای بر سی شارپ : قسمت- 3

benyamin_pc
شنبه 16 دی 1385, 13:01 عصر
یه مثال ساده میشه یه نفر از get & set بزنه؟

SabaSabouhi
شنبه 16 دی 1385, 13:40 عصر
با سلام
فرض کنید یک کلاس داریم که یک خروجى تولید مى‌کند. نیاز داریم به یک متد Save براى ذخیره کردن خروجى، و دو خاصیت Length براى دانستن طول خروجى و Path براى مسیر خروجى.
خاصیت Length فقط خواندنى هست و خاصیت Path هم خواندنى و هم نوشتنى.



Public class MyClass
Private int iLength;
Private string iPath;
public int Length{
get{return iLength;}
}
public string Path{
set{iPath=value;}
get{return iPath;}
}
public bool Save(...){
}



صبا صبوحى

عفت بزرگه
شنبه 16 دی 1385, 13:45 عصر
حتی اون خاصیت text که برای textbox و .... داری مبتنی بر get , set ‌است . میخاهی توی property window متد بزاری؟

iman_s52
سه شنبه 19 دی 1385, 20:05 عصر
کلا استفاده از فیلد های Pblic توصیه نمیشه ولی استفاده از Property های Pubnlic مشکلی نداره.
اگر بخوای از یه کلاس به یه سری اطلاعات اون دسترسی پیدا کنی می تونی فیلد هاتو Private تعریف کنی و خصوصیت اونو Public تعریف کنی و مقادیر رو با get و Set بخونی و ست کنی.

forodo
سه شنبه 20 خرداد 1393, 19:15 عصر
سلام
چه موقعی ای get و set استفاده می شن؟
چرا وقتی من می تونم اینطوری تعریف کنم:
public string con = @"Data Sorce=.;Initial Catalog=DB;...";
چرا اینطوری بهتره تعریف بشه؟
public string con = @"Data Sorce=.;Initial Catalog=DB;...";
public string Con
{
get
{
return con;
}
set
{
con = value;
}
}
فرق
class abc
{
public string con;
}
private void button1_Click(object sender, EventArgs e)
{
abc a = new abc();
a.con = "ali";
MessageBox.Show(a.con);
}
با این چیه؟
class abc
{
public string con;
public string Con
{
get
{
return con;
}
set
{
con = value;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
abc a = new abc();
a.Con = "ali";
MessageBox.Show(a.Con);
}

keyone72
سه شنبه 20 خرداد 1393, 19:18 عصر
فقط جنبه امنیتی داره

hamid_hr
سه شنبه 20 خرداد 1393, 19:40 عصر
نه اقا میشه باهاش کارای دیگه هم کرد

private string _IDPK;
public string IDPK
{
get { return _IDPK; }
set
{
_IDPK = value;
txtIDPK.Text = value;
}
}


این یه مثال کوچولو بود
ولی میشه وقتی اون مقدار IDPK ست شد یه تابعوو اجرا کرد یه event رو هندل کرد یا هر کاری که میشه تو برنامه نویسی کردو میشه اجرا کرد

forodo
چهارشنبه 21 خرداد 1393, 11:29 صبح
اینکارهارو بدون get و set هم میشه انجام داد.
مزیت get و set چیه که ازش استفاده کنیم.

hamid_hr
چهارشنبه 21 خرداد 1393, 12:25 عصر
نه شما فک کنین این مقدارو از یک فرم دیگه به این فرم میفرستیم
چطور میشه تکس باکس رو پر کرد زمانی که IDPK رو تغییر میدیم؟

forodo
چهارشنبه 21 خرداد 1393, 12:43 عصر
نه شما فک کنین این مقدارو از یک فرم دیگه به این فرم میفرستیم
چطور میشه تکس باکس رو پر کرد زمانی که IDPK رو تغییر میدیم؟
توی یه کلاس اینو می نویسیم:
class Class1
{
public static string TextboxMatn = "";
}
توی فرم اول که می خوام متن تکست باکس بریزه توی یه تکست باکس دیگه از یه فرم دیگه اینو می نویسیم:
private void button1_Click(object sender, EventArgs e)
{
Class1.TextboxMatn = textBox1.Text;
Form2 f = new Form2();
f.ShowDialog();
}
توی فرم 2 که تکست باکش قرار متن تکست باکس فرم1 رو بگیره اینو می نویسیم.
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = Class1.TextboxMatn;
}

hamid_hr
چهارشنبه 21 خرداد 1393, 12:47 عصر
خب عزیزم هزار تا راه هست که این کارو بکنی
ولی به نظر من بهترین راه همون تعریف property هست و استفاده از متد set

mehdi.mousavi
چهارشنبه 21 خرداد 1393, 12:49 عصر
سلام.
قبل از هر چیز بگم کدی که شما نوشتید، یعنی کد زیر:

public string con = @"Data Sorce=.;Initial Catalog=DB;...";
public string Con
{
get
{
return con;
}
set
{
con = value;
}
}


هیچ برتری ای نسبت به

public string con = @"Data Sorce=.;Initial Catalog=DB;...";

نداره. فقط کد رو شلوغ کرده و هیچ کمکی هم بهمون نمیکنه. اما get/set (که بهش میگن Accessors) کجا مورد استفاده داره؟

کد زیر رو در نظر بگیرید (بعنوان نمونه):


private int Temperature
{
get { return (int)(ViewState["Temperature"] ?? 0); }
set { ViewState["Temperature"] = value; }
}


همونطوریکه می بینید، اینجا "دما" ی اتاق با استفاده از ViewState ها داره مدیریت میشه. یعنی استفاده کننده از جزییات پیاده سازی این Property اطلاع نداره و نمیدونه این "دما" داره از کجا استخراج میشه (یا در کجا نگهداری میشه). اگر شما Temperature Property رو به شکل فوق (با فرض اینکه مدیریتش بر عهده ViewState باشه) مدیریت نکنید، اونوقت هر جای برنامه که نیاز داشته باشید دما رو بگیرید، باید مستقیما به ViewState["Temperature"] دسترسی داشته باشید و این، درست نیست، چرا که اگر نیاز فردا روزی بنا به نیازهای پروژه نخواهید از ViewState برای مدیریت متغیر فوق استفاده کنید، اونوقت باید N نقطه از برنامه رو تغییر بدید و ...

حالا مثال زیر رو در نظر بگیرید:

public string ConnectionString
{
get { return this.connectionString; }
private set { this.connectionString = value; }
}


به Modifier هایی که روی Property تعریف کردم، دقت کنید. در حال حاضر، شما می تونید ConnectionString Property رو بدلیل Public بودنش از همه جا Call کنید. اما، دقت کنید که set رو چطور private تعریف کرده ام. این بدین معنی هستش که علیرغم اینکه ConnectionString بصورت public تعریف شده، اما کسی (جز اعضای کلاس فعلی) اجازه SET کردن اون Property رو ندارن. پس فقط خودم، میتونم در کلاسی که تعریف کرده ام، Set اش کنم، و بقیه جاها، دیگر کلاس ها، از مقدار Set شده استفاده کنند.

حالا تعریف زیر رو در نظر بگیرید:

public string Temperature
{
get { return this.temperature; }
set
{
if(this.temperature != value)
{
OnPropertyChanging("Temperature");
this.temperature = value;
OnPropertyChanged("Temperature");
}
}
}


اینجا، دارم با استفاده از Accessor ها، متودهای Changing و Changed ای رو Call میکنم تا دیگران در صورت لزوم، از تغییر Temperature آگاه بشن. حالا هر وقت، مقدار Temperature رو (هر کسی که دسترسی داره) تغییر بدن، متودهای متناظر Call خواهد شد و ...

حالا مثال زیر رو در نظر بگیرید:


abstract class Room
{
public abstract int Temperature
{
get;
set;
}
}

اینجا، کلاس "اتاق" به گونه ای تعریف شده که مابقی کلاس هایی که قراره از اون Derive بشن، اجازه override کردن Temperature رو داشته باشن و ... شما این کارها رو نمیتونید با تعریف یک متغیر انجام بدید...

برای اطلاعات بیشتر لطفا به این آدرس (http://msdn.microsoft.com/en-us/library/aa287786%28v=vs.71%29.aspx) رجوع کنید.

موفق باشید.