مشخصات مقاله
-
1612
-
0.0
-
7193
-
0
-
0
آموزش خصوصیات(Properties) در C-Sharp
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
خصوصیات (Properties)
این درس مبحث خصوصیات در درس C# را آموزش خواهد داد. اهدافمان بقرار زیر می باشند.
درک اینکه خصوصیات چه هستند
پیاده سازی یک خصوصیت
ایجاد یک خاصیت فقط خواندنی
ایجاد یک خاصیت فقط نوشتنی
ایجاد یک خاصیت پیاده سازی خودکار
مروری بر خصوصیات
خصوصیات فرصت محافظت از یک فیلد در یک کلاس را با خواندن و نوشتن به آن از طریق خواص فراهم می سازد.در زبانهای دیگر این کار اغلب با برنامه هایی انجام می شوند که متد های setter و getter ویژه ای را پیاده سازی می سازند. خصوصیات C# این نوع از حفاظت را فعال می نماید و به علاوه در حالی که اجازه دسترسی به خواص را درست مثل این که یک فیلد باشد می دهد.
فایده دیگر خواص این است که می توانید پیاده سازی داخلی شان را در هر زمان عوض نمایید. با یک فیلد عمومی نوع داده زیرین می بایستی همیشه یکسان باشند زیرا فراخوانی کد بستگی به مشابه بودن فیلد خواهد بود. برای مثال اگر یک مشتری ID ای داشته باشد که اصولا بصورت int ذخیره شده باشد، ممکن است نیاز به تغییراتی داشته باشید که یک تاییدیه انجام می دهد تا مطمئن شوید فراخوانی کد هرگز نباید ID ی با مقدار منفی داشته باشد. اگر آن یک فیلد بود قادر به این کار نبودید اما یک خاصیت اجازه می دهد تا این تغییرات را بدون شکستن کد انجام دهید حال اجازه دهید به چگونگی استفاده از خواص نگاهی بیاندازیم.
کپسوله سازی سنتی بدون خصوصیات
زبانهائی که خصوصیات ندارند از متدها (توابع یا روال ها) برای کپسوله سازی استفاده می کنند. این ایده مقادیر درون شی، وضعیت، پرهیز از خرابی و استفاده غلط را با فراخوانی کد مدیریت می نماید. لیست 1-10 نشان می دهد که چطور این متد سنتی کار می کند؛و اطلاعات مشتری را از طریق متد های دستیابی کپسوله سازی می نماید.
لیست 1-10 .مثالی از دستیابی به فیلد کلاس سنتی
Listing 10-1. An Example of Traditional Class Field Access using System; public class Customer { private int m_id = -1; public int GetID() { return m_id; } public void SetID(int id) {
m_id = id;
} private string m_name = string.Empty; public string GetName() { return m_name; } public void SetName(string name) { m_name = name; } } public class CustomerManagerWithAccessorMethods { public static void Main() { Customer cust = new Customer();
cust.SetID(1); cust.SetName("Amelio Rosales"); Console.WriteLine( "ID: {0}, Name: {1}", cust.GetID(), cust.GetName()); Console.ReadKey(); } }
لیست 1-10 متد سنتی از دستیابی به فیلدهای کلاس را نشان می دهد. کلاس Customer چهار متد دارد، دو تا برای هر فیلد خصوصی (Private) که کلاس کپسوله می سازد : m_id و m_name. همان طور که می بینید SetID و SetName مقادیر جدیدی را واگذار می سازد و مقادیر GetID و GetName را بر گشت می دهد. بررسی کنید که چطور main متد های SetXxx را صدا میزند و این که فیلد های m_id را به 1 و m_name را به "Amelio Rosales" در نمونه مشتری به نام cust مقداردهی می نماید. فراخوانی Console.WriteLine چگونگی خواندن m_id و m_name را از cust و از طریق فراخوانی متدهای GetName و GetID و بر عکس نشان می دهد. این موضوع همان الگوی عمومی در زبان C# است که به نام ویژگی خصوصیات نام گذاری شده و شما در بخش آتی آنرا بیشتر خواهید دید.
کپسوله سازی حالت (State) نوع با خصوصیات
تمرین دستیابی به فیلد دیتا از طریق متدها کار خوبی بود، زیرا از مفهوم کپسوله سازی در زبان شی گرا پشتیبانی می کرد. مثلا اگر m_id یا m_name از یک نوع int به byte عوض شوند، کد فراخوانده هنوز هم کار خواهد کرد. حال همان چیز را می توان به روشی بسیار ملایم تر با خصوصیات از طریق لیست 2-10 نشان می دهیم.
لیست 2-10 . دستیابی به فیلدهای کلاس با خصوصیات
Listing 10-2. Accessing Class Fields With Properties using System; public class Customer { private int m_id = -1; public int ID { get { return m_id; } set { m_id = value; } } private string m_name = string.Empty; public string Name { get { return m_name; } set { m_name = value; } } } public class CustomerManagerWithProperties { public static void Main() { Customer cust = new Customer(); cust.ID = 1; cust.Name = "Amelio Rosales"; Console.WriteLine( "ID: {0}, Name: {1}", cust.ID, cust.Name); Console.ReadKey(); } }
لیست 2-10 نشان می دهد که چطور یک خاصیت را درست و از آن استفاده کنیم. کلاس Customer پیاده سازی های خاصیت Name و ID را دارد. فیلد های خصوصی نیز با نام های m_id و m_name وجود دارند : ID و Name بطور برعکس کپسوله می شوند. هر خاصیت (Property) دو متد به نام های get و set دارند.get مقدار یک فیلد را برمی گرداند،set مقدار یک فیلد را با مفاد value پر می کند که این مقدار با فراخوانی کد واگذار می شود.value اشاره شده در متد set، یک کلمه رزرو شده C# است.
وقتی یک خاصیت را واگذار می کنید فقط مقداری را به خاصیت بدهد طوری که انگار آن یک فیلد است. کلاس CustomerManagerWithProperties از خواص name و ID در کلاس Customer استفاده می کنند. اولین خط main یک شی Customer به نام Cust را مقداردهی می سازد. مقدار بعدی فیلد های m_id و m_name از شی cust توسط خواص Name و ID مقدار دهی می شوند. برای خواندن از خواص مثل اینکه یک فیلد است استفاده کنید. Console.WriteLine مقدار فیلد های m_id و m_name از cust را چاپ می کنند. این کار با فراخوانی خواص Name و ID ی شی cust انجام می شود.
ایجاد خواص فقط خواندنی
خصوصیات می توانند فقط خواندنی باشند. این کار با داشتن تنها دسترسی get در پیاده سازی خواص انجام می پذیرد. لیست 3-10 چگونگی ایجاد یک خاصیت فقط خواندنی را نشان می دهد.
لیست 3-10 .خصوصیات فقط خواندنی
Listing 10-3. Read-Only Properties
using System;
public class Customer
{
private int m_id = -1;
private string m_name = string.Empty;
public Customer(int id, string name)
{
m_id = id;
m_name = name;
}
public int ID
{
get
{
return m_id;
}
}
public string Name
{
get
{
return m_name;
}
}
}
public class ReadOnlyCustomerManager
{
public static void Main()
{
Customer cust = new Customer(1, "Amelio Rosales");
Console.WriteLine(
"ID: {0}, Name: {1}",
cust.ID,
cust.Name);
Console.ReadKey();
}
}
کلاس Customer در لیست3-10 در خصوصیت فقط خواندنی به نام های name و ID دارد. می توانید بگویید که تمام خصوصیات فقط خواندنی هستند زیرا فقط دسترس ساز get را دارند. در برخی اوقات، مقادیر m_name و m_id می بایستی واگذار شوند که حکم سازنده در این مثال می باشد.
متد Main از کلاس ReadOnlyCustomerManager یک شی مشتری به نام cust می سازد. آماده سازی و مقدار دهی cust از مخرب کلاس Customer استفاده می کند که پارامتر هایی از نوع int و string را می گیرد.در این حالت مقادیر 1 و "Amelio Rosales" هستند. این کار فیلد های m_id و m_name از cust را مقدار دهی اولیه می کند. چون خواص name و ID از کلاس Customer فقط خواندنی هستند، راه دیگری برای تنظیم مقدار فیلد های m_name و m_id وجود ندارد. اگر در لیست برنامه وارد کنید cust.ID = 7 برنامه کامپایل نخواهد شد، زیرا ID فقط خواندنی است و همان برای Name هم تکرار می شود. وقتی خواص ID و Name در Console.WriteLine بکار روند خوب کار می کنند. بدین دلیل که این عملیات خواندنی هستند که فقط دسترس ساز get از خواص name و ID را احضار می کنند. سوالی که باید داشته باشید این است که "اگر خاصیتی خواندنی باشد، می تواند فقط نوشتنی هم باشد؟ " جواب بلی است و در بخش بعد شرح می دهیم.
ایجاد یک خاصیت فقط نوشتنی
می توانید مقادیر را واگذار کنید، اما خواندن نه. خاصیت نوشتنی فقط یک دسترس ساز set دارد. لیست 4-10 چگونگی ایجاد و استفاده از خواص فقط نوشتنی را نشان می دهد.
لیست 4-10.خواص فقط نوشتنی
Listing 10-4. Write-Only Properties using System; public class Customer { private int m_id = -1; public int ID { set
{ m_id = value; } } private string m_name = string.Empty; public string Name { set { m_name = value; } } public void DisplayCustomerData() { Console.WriteLine("ID: {0}, Name: {1}", m_id, m_name); } } public class WriteOnlyCustomerManager { public static void Main() { Customer cust = new Customer(); cust.ID = 1; cust.Name = "Amelio Rosales"; cust.DisplayCustomerData(); Console.ReadKey(); } }
در این زمان دستور get از خصوصیات Name و ID از کلاس Customer حذف گردیده که در لیست 1-10 آمده. اصلاح گر دسترسی set اضافه شده اند که مقادیر را به فیلد های یدکی m_id و m_name واگذار می کنند.
وقتی شما مقدار زیادی خصوصیت در یک کلاس یا struct داشته باشید، مقدار زیادی کد هم مربوط به آنها وجود خواهد داشت.
ایجاد خواص پیاده سازی شده ی خودکار
C#3.0 شیوه جدیدی برای خواص معرفی کرده و آن را یک خاصیت پیاده شده خودکار نامیده است که به شما اجازه می دهد خواصی بدون پیاده سازهای get و set درست نمایید. لیست 5-10 خاصیت پیاده شده خودکار برای یک کلاس را نشان می دهد.
Listing 10-5. Auto-Implemented Properties using System; public class Customer { public int ID { get; set; } public string Name { get; set; } } public class AutoImplementedCustomerManager { static void Main() { Customer cust = new Customer(); cust.ID = 1; cust.Name = "Amelio Rosales"; Console.WriteLine( "ID: {0}, Name: {1}", cust.ID, cust.Name); Console.ReadKey(); } }
به پیاده سازی get و set توجه نمایید. در یک خاصیت پیاده سازی شده خودکار کامپایلر C# ذخیره سازی قبلی فیلد را در پس زمینه درست می کند و همان منطق مشابه ای که قبلا برای خواص سنتی وجود داشت می دهد، اما نمی گذارد که مجبور شوید از تمام شیوه خواص سنتی استفاده نمایید. همان طور که می توان در متد main دید، استفاده از خاصیت پیاده شده خودکار دقیقا مشابه خواص سنتی ای که شما در بخش های قبل یاد گرفته اید.