درس دهم – ویژگیها در C#
در این درس با ویژگیها (Properties) در زبان C# آشنا خواهیم شد. اهداف این درس به شرح زیر میباشد :
Property ها امکان ایجاد حفاظت از فیلدهای یک کلاس را از طریق خواندن و نوشتن بوسیله Property را فراهم مینماید. Property ها علاوه بر اینکه از فیلدهای یک کلاس حفاظت میکنند، همانند یک فیلد قابل دسترسی هستند. بمنظور درک ارزش Property ها بهتر است ابتدا به روش کلاسیک کپسوله کردن متدها توجه نمایید.
مثال 1-10 : یک نمونه از چگونگی دسترسی به فیلدهای کلاس به طریقه کلاسیک
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;
}
}
مثال 1-10 روش کلاسیک دسترسی به فیلدهای یک کلاس را نشان میدهد. کلاس PropertyHolder دارای فیلدی است تمایل داریم به آن دسترسی داشته باشیم. این کلاس دارای دو متد getSomeProperty() و setSomePropery() میباشد. متد getSomeProperty() مقدار فیلد someProperty را باز میگرداند و متد setSomeProperty() مقداری را به فیلد someProperty تخصیص میدهد.
کلاس PropertyTester از متدهای کلاس PropertyHolder جهت دریافت مقدار فیلد someProperty از کلاس PropertyHolder استفاده میکند. در متد Main() نمونه جدیدی از شی PropertyHolder با نام propHold ایجاد میگردد. سپس بوسیله متد setSomeProperty، مقدار someMethod از propHold برابر با 5 میگردد و سپس برنامه مقدار property را با استفاده از فراخوانی متد Console.WriteLine() در خروجی نمایش میدهد. آرگومان مورد استفاده برای بدست آوردن مقدار property فراخوانی به متد getSomeProperty() است که توسط آن عبارت “Property Value : 5” در خروجی نمایش داده میشود.
چنین متد دسترسی به اطلاعات فیلد بسیار خوب است چرا که از نظریه کپسوله کردن شیءگرایی پشتیبانی میکند. اگر پیادهسازی someProperty نیز تغییر یابد و مثلا از حالت int به byte تغییر یابد، باز هم این متد کار خواهد کرد. حال همین مسئله با استفاده از خواص Property ها بسیار سادهتر پیادهسازی میگردد. به مثال زیر توجه نمایید.
مثال 2-10 : دسترسی به فیلدهای کلاس به استفاده از 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;
}
}
مثال 2-10 چگونگی ایجاد و استفاده از ویژگیها (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)
مثال 3-10 : ویژگیهای فقط خواندنی
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;
}
}
مثال 3-10 چگونگی ایجاد یک ویژگی فقط خواندنی را نشان میدهد. کلاس 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)
به مثال زیر توجه فرمایید :
مثال 4-10 : ویژگیهای فقط خواندنی
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;
}
}
مثال 4-10 چگونگی ایجاد و استفاده از ویژگی فقط نوشتنی را نشان میدهد. در این حالت get accessor را از ویژگی SomeProperty حذف کرده و به جای آن set accessor را قرار دادهایم.
متد Main() کلاس PropertyTester شیای جدید از همین کلاس با سازندة پیش فرض آن ایجاد مینماید. سپس با استفاده از ویژگی SomeProperty از شیء propHold، مقدار 5 را به فیلد someProperty مربوط به شیء propHold تخصیص میدهد. در این حالت set accessor مربوط به ویژگی SomeProperty فراخوانی شده و مقدار 5 را به فیلد someProperty تخصیص میدهد و سپس عبارت someProperty is equal to 5” “را در خروجی نمایش میدهد.
خلاصه
در این درس با ویژگیها آشنا شدید و نحوه استفاده از آنها را فرا گرفتید. روشهای کلاسیک کپسوله کردن از طریق استفاده از متدهای مجزا صورت میگرفت ولی با استفاده از ویژگیها (Property) میتوان به اجزای یک شیء همانند یک فیلد دسترسی پیدا کرد. ویژگیها را میتوان به صورت فقط خواندنی و یا فقط نوشتنی نیز ایجاد نمود. با استفاده از ویژگیها دسترسی مستقیم به فیلدهای مورد نظر از یک کلاس از بین رفته و این دسترسی تنها از طریق ویژگی مورد نظر امکانپذیر میگردد.