در این مقاله، ما قصد داریم در مورد اعضای static در #c صحبت کنیم و اینکه چه زمانی و چرا باید از آنها استفاده کنیم.
این مقاله، سرفصلی از دوره آموزشی زیر میباشد:
- کلاسها و سازنده ها
- ویژگیها
- constant ،Static member ها و Extension Method ها
- Anonymous Type ها و Nullabel Type ها
- ساختارها
- شمارنده ها
- وراثت
- Interface ها
- کلاسهای Abstract
- Generic ها
- Queue, Stack, Hashtable
- Generic List و Dictionary
- Delegate ها
اگر می خواهید محتویات کامل این دوره را ببینید ، می توانید بر روی لینک سطح متوسطه #C کلیک کنید.
برای دانلود سورس، بر روی لینک سورس اعضای static در #c کلیک کنید.
ما میخواهیم این مقاله را به قسمتهای زیر تقسیم کنیم:
- متدهای static
- کار با یک متد static
- ایجاد یک فیلد با استفاده از کلمه Const
- کلاس Static
- متدهای Extension و نحوه استفاده از آنها
- نتیجه گیری
متدهای Static
زمانیکه ما یک متد را در یک کلاس تعریف می کنیم ، آن متد متعلق به آن کلاس میشود و هر نمونه ایجاد شده از آن کلاس، میتواند به آن متد دسترسی داشته باشد. یک کلاس میتواند متدهای خیلی زیادی داشته باشد. اما تعدادی متد وجود دارد که مستقل از آن نمونه کلاس مورد نظر هستند. این نمونه از متدها، “متدهای static” نام دارند. بنابراین متدهای static، متدهایی هستند که به یک نمونه از یک کلاس تعلق ندارند و میتوانند فقط با عناصر static دیگر تعامل برقرار کنند و کلمه کلیدی static را در تعریف متد داشته باشند.
اجازه بدید متد ()Sqrt را به عنوان مثال داشته باشیم. این متد، جذر یک عدد را محاسبه میکند و ما نیازی نیست کلاس Math را نمونه سازی کنیم (که متد Sqrt به آن تعلق دارد). زیرا این متد، یک متد static است:
1 2 |
int number = 4; Console.WriteLine(Math.Sqrt(number)); |
بنابراین، چرا متد Sqrt یک متد static است و غیر static نیست؟
خب، Sqrt فقط یک آرگومان میپذیرد و آن برای اینکه این متد کارش را انجام دهد کافی است. ما یک آرگومان عددی به متد میدهیم و آن جذر آن عدد را برمیگرداند. ما اصلا از کلاس Math نمونه ای نساختیم. به این دلیل که نیازی به این کار نیست. کلاس Math هیچ حمایتی بر روی متد Sqrt برای انجام دادن کارش ارائه نمیدهد. بلکه این کلاس فقط یک فضا برای مستقر شدن متد Sqrt فراهم میکند.
زمانیکه ما موردی مثل همین مورد ذکر شده داریم، ایجاد یک متد static معمولا راهکار خوبی میباشد.
کار با یک متد static
برای صدا زدن یک متد static، همانطور که گفتیم، نیازی به ایجاد نمونه از آن کلاس نیست. بلکه میتوانیم آن را با سینتکس زیر صدا بزنیم:
1 |
ClassName.MethodName(arguments…); |
بنابرین وقتیکه ما از متد Sqrt یا هر متد دیگری از کلاس Math استفاده میکنیم، آنگاه میتوانیم به این صورت آن را فراخوانی کنیم: Math.Sqrt(16).
ایجاد یک فیلد با استفاده از کلمه کلیدی Const
اگر ما فیلدمان را با پیشوند کلمه const ایجاد کنیم، میتوانیم فیلدی را تعریف کنیم که مقدار آن هرگز تغییر نکند. کلمه const کوتاه شده کلمه constant است. یک عضو constant در زمان کامپایل تعریف میشود و در زمان اجرا نمیتواند تغییر کند.
ما میتوانیم به روش زیر، یک متغیر const ایجاد کنیم: AccessModifier const Type Name = Value;

کلاس Static
در #c، در کنار متدهای استاتیک می توان کلاسهای استاتیک را نیز تعریف کرد. کلاس static میتواند فقط شامل اعضای static باشد. هدف آن این است که به عنوان یک نگهدارنده برای متدها و فیلدهای پرکاربرد عمل کند. نمونه سازی این نوع از کلاسها با کلمه new، هیچ دلیلی ندارد. علاوه بر این، ما نمیتوانیم اصلا این کار را انجام دهیم. اما ما می توانیم یک سازنده پیش فرض ایجاد کنیم به شرطی که آن یک سازنده static باشد. هر نوع دیگری از سازنده غیرقانونی است:
1 2 3 4 5 6 7 8 9 |
public static class TestClass { private static int number; static TestClass() { number = 54; } } |
متدهای Extension و نحوه استفاده از آنها
فرض کنید می خواهیم یک ویژگی جدید به نوع string اضافه کنیم. برای مثال، قابلیت FirstLetterUpperCase که اولین حرف یک رشته را به حرف بزرگ تبدیل میکند. برای این منظور، ما میتوانیم یک متد معمولی بنویسیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static string FirstLetterUpperCase(string word) { char letter = Char.ToUpper(word[0]); string remaining = word.Substring(1); return letter + remaining; } static void Main(string[] args) { string word = "football"; string newWord = FirstLetterUpperCase(word); } |
اما همانطور که اینجا میبینید ما باید همیشه یک کلمه را به عنوان یک پارامتر بفرستیم و مقدار بازگشتی را تحویل بگیریم. این یک رویکرد اشتباه نیست اما ما میتوانیم این کار را بهتر نیز انجام دهیم. اینجاست که متدهای extension به روی کار می آیند.
یک متد extension ما را قادر میسازد تا یک type موجود را با متدهای static اضافی توسعه دهیم. ما باید این نوع از متدها را داخل یک کلاس static ایجاد کنیم و این متدها، قبل از اولین پارامترشان، کلمه کلیدی this به عنوان پیشوند قرار میگرد.
اما چرا ما باید یک پیشوند قبل از اولین پارامتر قرار دهیم؟
زیرا این پارامتر، شاخصی است که به کامپایلر می گوید که در حال توسعه کدام type هستیم.
پس مثال قبلی را یکبار دیگر مینویسیم اما اینبار با متد extension:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public static class StringExtensions { public static string FirstLetterUpperCase(this string word) { char letter = Char.ToUpper(word[0]); string remaining = word.Substring(1); return letter + remaining; } } class Program { static void Main(string[] args) { string word = "football" .FirstLetterUpperCase(); Console.WriteLine(word); Console.ReadKey(); } } |

بسیار عالی.
نتیجه گیری
ما کار خود را با اعضای static تمام کردیم و اکنون یک ابزار عالی در جعبه ابزار خود داریم که می توانیم هنگام توسعه برنامه های #C خود از آن استفاده کنیم.
در این مقاله، ما یاد گرفتیم:
- نحوه استفاده از کلاسهای static
- شیوه استفاده از متدهای static
- نحوه ایجاد متدهای extension
- در مورد کلمه کلیدی const و ایجاد constant ها
در مقاله بعدی، در مورد Anonymous Type ها و Nullable Type ها در #C صحبت میکنیم.