آموزش سی شارپ c# درس دهم

 
ارسال شده در تاریخ 1392/7/22 توسط admin در زمینه آموزش سی شارپ
 
درس دهم - ویژگیها در C#
 
در این درس با ویژگیها (Properties) در زبان C# آشنا خواهیم شد . اهداف این درس به شرح زیر میباشد :
• موارد استفاده از Property ها
• پیا دهسازی Property
• ایجاد Property فقط خواندنی (Read-Only)
• ایجاد Property فقط نوشتنی (Write-Only)
 
Property ها امکان ایجاد حفاظت از فیلدهای یک کلاس را از طریق خواندن و نوشتن بوسیله Property را فراهم می نماید . Property ها علاوه بر اینکه از فیلدهای یک کلاس حفاظت می کنند، همانند یک فیلد قابل دسترسی هستند . بمنظور دری ارزش Property ها بهتر است ابتدا به روش کلاسیک کپسوله کردن متدها توجه نمایید .
 
مثال : 10-1 یک نمونه از چگونگی دسترسی به فیلدهای کلاس به طریقه کلاسیک
using System;
public class PropertyHolder
{
private int someProperty = 0; public int getSomeProperty()
{
return someProperty;
}
public void setSomeProperty(int propValue)
{
someProperty = propValue;
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder(); propHold.setSomeProperty(5);
Console.WriteLine("Property Value: {0}", propHold.getSomeProperty()); return 0;
}
}
مثال 10-1 روش کلاسیک دسترسی به فیلدهای یک کلاس را نشان می دهد . کلاس PropertyHolder دارای فیلدی است تمایل داریم به آن دسترسی داشته باشیم . این کلاس دارای دو متد getSomeProperty() و setSomePropery() میباشد . متد getSomeProperty() مقدار فیلد someProperty را باز میگرداند و متد setSomeProperty() مقداری را به فیلد someProperty تخصیص میدهد .
 
 
www.iranproje.com
کلاس PropertyTester از متدهای کلاس PropertyHolder جهت دریافت مقدار فیلد someProperty از کلاس PropertyHolder استفاده میکند . در متد Main() نمونه جدیدی از شی PropertyHolder با نام propHold ایجاد می گردد . سپس بوسیله متد setSomeProperty ، مقدار someMethod از propHold برابر با 5 می گردد و سپس برنامه مقدار property را با استفاده از فراخوانی متد Console.WriteLine() در خروجی نمایش میدهد . آرگومان مورد استفاده برای بدست آوردن مقدار property فراخوانی به متد getSomeProperty() است که توسط آن عبارت Property Value “ ” : 5 در خروجی نمایش داده میشود “ .
 
چنین متد دسترسی به اطلاعات فیلد بسیار خوب است چرا که از نظریه کپسوله کردن شیء گرایی پشتیبانی میکند . اگر پیا دهسازی someProperty نیز تغییر یابد و مثلا از حالت int به byte تغییر یابد، باز هم این متد کار خواهد کرد . حال همین مسئله با استفاده از خواص Property ها بسیار ساده تر پیاده سازی می گردد . به مثال زیر توجه نمایید .
 
مثال : 10-2 دسترسی به فیلدهای کلاس به استفاده از Property ها
using System;
public class PropertyHolder
{
private int someProperty = 0; public int SomeProperty
{ get
{
return someProperty;
} set
{
someProperty = value;
}
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder(); propHold.SomeProperty = 5;
Console.WriteLine("Property Value: {0}", propHold.SomeProperty); return 0;
}
}
 
مثال 10 -2 چگونگی ایجاد و استفاده از ویژگیها (Property) را نشان میدهد . کلاس PropertyHolder دارای پیاده سازی از ویژگی SomeProperty است . توجه نمایید که اولید حرف از نام ویژگی با حرف بزرگ نوشته شده و این تنها تفاوت میان اسم ویژگی SomeProperty و فیلد someProperty میباشد . ویژگی دارای دو accessor با نامهای set و get است accessor . get مقدار فیلد someProperty را باز می گرداند set accessor . نیز با استفاده از مقدار value ، مقداری را به
 
someProperty تخصی ص میدهد . کلمه value که در set accessor آورده شده است جزو کلمات رزرو شده زبان C# می باشد .
 
کلاس PropertyTester از ویژگی someProperty مربوط به کلاس PropertyHolder استفاده میکند . اولین خط در متد Main() شیای از نوع PropertyHolder با نام propHold ایجاد می نماید . سپس مقدار فیلد someProperty مربوط به شیء propHold ، با استفاده از ویژگی SomeProperty به 5 تغییر مییابد و ملاحظه می نمایید که مسئله به همین سادگی است و تنها کافی است تا مقدار مورد نظر را به ویژگی تخصیص دهیم .
 
پس از آن، متد Console.WriteLine() مقدار فیلد someProperty شیء propHold را چاپ مینماید . این عمل با استفاده از ویژگی SomeProperty شیء propHold صورت میگیرد .
 
ویژگیها را می توان طوری ایجاد نمود که فقط خواندنی (Read-Only) باشند . برای این منظور تنها کافیست تا در ویژگی فقط از get accessor استفاده نماییم . به مثال زیر توجه نمایید .
 
ویژگیهای فقط خواندنی (Read-Only Properties) مثال : 10-3 ویژگیهای فقط خواندنی
using System;
public class PropertyHolder
{
private int someProperty = 0; public PropertyHolder(int propVal)
{
someProperty = propVal;
}
public int SomeProperty
{ get
{
return someProperty;
}
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder(5);
Console.WriteLine("Property Value: {0}", propHold.SomeProperty); return 0;
}
}
 
 
www.iranproje.com
مثال 10 -3 چگونگی ایجاد یک ویژگی فقط خواندنی را نشان می دهد . کلاس PropertyHolder دارای ویژگی
SomeProperty است که فقط get accessor را پیا دهسازی می کند . این کلاس PropertyHolder دارای سازنده ایست که پارامتری از نوع int دریافت مینماید .
 
متد Main() از کلاس PropertyTester شیء جدیدی از PropertyHolder با نام propHold ایجا د مینماید . این نمونه از کلاس PropertyHolder از سازنده آن که مقداری صحیح را بعنوان پارامتر دریافت می کند، استفاده می کند . در این مثال این مقدار برابر با 5 در نظر گرفته می شود . این امر باعث تخصیص داده شدن عدد 5 به فیلد someProperty از شیء propHold میشود .
 
تا زمانیکه ویژگی SomeProperty از کلاس PropertyHolder فقط خواندنی است، هیچ راهی برای تغییر مقدار فیلد someProperty وجود ندارد . بعنوان مثال در صورتیکه عبارت propHold.SomeProperty = 7 را در کد برنامه اضافه نمایید، برنامه شما کامپایل نخواهد شد چراکه ویژگی SomeProperty فقط خواندنی است . اما اگر از این ویژگی در متد Console.WriteLine() استفاده نمایید بخوبی کار خواهد کرد زیرا این دستور تنها یک فرآیند خواندن است و با استفاده از get accessor این عمل قابل اجرا است .
 
ویژگیهای فقط نوشتنی (Write-Only Properties) به مثال زیر توجه فرمایید :
 
مثال : 10-4 ویژگیهای فقط خواندنی
using System;
public class PropertyHolder
{
private int someProperty = 0; public int SomeProperty
{ set
{
someProperty = value;
Console.WriteLine("someProperty is equal to {0}", someProperty);
}
}
}
public class PropertyTester
{
public static int Main(string[] args)
{
PropertyHolder propHold = new PropertyHolder(); propHold.SomeProperty = 5; return 0;
}
}
 
 
www.iranproje.com
مثال 10-4 چگونگی ایجاد و استفاده از ویژگی فقط نوشتنی را نشان می دهد . در این حالت get accessor را از ویژگی SomeProperty حذف کرده و به جای آن set accessor را قرار دا دهایم .
 
متد Main() کلاس PropertyTester شی ای جدید از همین کلاس با سازنده پیش فرض آن ایجاد می نماید . سپس با استفاده از ویژگی SomeProperty از شیء propHold ، مقدار 5 را به فیلد someProperty مربوط به شیء propHold تخصیص میدهد . در این حالت set accessor مربوط به ویژگی SomeProperty فراخوانی شده و مقدار 5 را به فیلد
someProperty تخصیص میدهد و سپس عبارت ” someProperty is equal to 5 “ را در خروجی نمایش میدهد .
 
خلاصه
در این درس با ویژگیها آشنا شدید و نحوه استفاده از آنها را فرا گرفتید . روشهای کلاسیک کپسوله کردن از طریق استفاده از متدهای مجزا صورت میگرفت ولی با استفاده از ویژگیها (Property) می توان به اجزای یک شیء همانند یک فیلد دسترسی پیدا کرد . ویژگیها را میتوان به صورت فقط خواندنی و یا فقط نوشتنی نیز ایجاد نمود . با استفاده از ویژگیها دسترسی مستقیم به فیلدهای مورد نظر از یک کلاس از بین رفته و این دسترسی تنها از طریق ویژگی مورد نظر امکا نپذیر میگردد .

 

Copyright © 2014 icbc.ir