آشنایی با مفهوم متغیرها

وقتی در برنامه‌نویسی می‌خواهیم دربارۀ یک مقدار صحبت کنیم یا مقداری را نگه داریم که بعداً از آن استفاده کنیم (مثلاً بعداً آن را نمایش دهیم یا به کمک آن محاسباتی را انجام دهیم و...)، یا به جای یک مقدار از نامی استفاده کنیم که توصیف‌کنندۀ آن مقدار باشد، یک متغیر (Variable) تعریف می‌کنیم و مقدار مورد نظرمان را به آن تخصیص می‌دهیم. 

اهمیت استفاده از متغیرها

فرض کنید می‌خواهیم یک سایت فروشگاهی درست کنیم. برای این کار باید اطلاعات هر محصول مانند عنوان، عکس، قیمت، توضیحات، دسته‌بندی، و تمام موارد مربوط به محصول را داشته باشیم. برای این کار در زبان برنامه‌نویسی از متغیر استفاده می‌کنیم. یک متغیر برای عنوان، یک متغیر برای قیمت، یک متغیر برای توضیحات، و به همین صورت تمام متغیر‌های لازم را تعریف می‌کنیم و از این به بعد هر جا که می‌خواهیم عنوان محصول را نمایش دهیم از متغیر مربوط به عنوان محصول استفاده می‌کنیم و هر جایی که می‌خواهیم قیمت را نمایش دهیم یا از آن در محاسبات استفاده کنیم (برای مثال در سبد خرید)، از متغیر مربوط به قیمت استفاده می‌کنیم (البته این فقط یک مثال است و هنگام ساخت یک فروشگاه اینترنتی موارد بیشتر و دقیق‌تری را باید در نظر بگیریم که فعلاً آن‌ها را نادیده می‌گیریم).

  1. فرض کنید می‌خواهیم امکان اعمال تخفیف روی محصولات هم وجود داشته باشد. چه متغیر‌های دیگری می‌توانیم برای این کار در نظر بگیریم؟

  2. فرض کنید می‌خواهیم یک سایت خبری درست کنیم که اخبار را نشان دهد. چه متغیر‌هایی برای یک خبر می‌توانیم در نظر بگیریم؟ (راهنمایی: یک سایت خبری در اینترنت پیدا کنید و متغیرهایی را که مربوط به یک خبر هستند به دست آورید مثلاً عنوان خبر، تاریخ خبر، موضوع خبر، و غیره).

  3. یک سناریوی دیگر برای استفاده از متغیر (مانند مثال فروشگاه که در بالا گفته شد) مثال بزنید.

لیترال چیست؟

تمام مقادیری که استفاده می‌کنیم لیتِرال (literal) نام دارند. مثلاً عدد صحیح 100، یا عدد اعشاری 2.5 یا متن "سلام سی‌شارپ" همگی لیترال هستند. با توجه به این‌که زبان C# یک زبان نوع قوی (strong type) است، باید هر لیترال را در نوع دادۀ مخصوص به آن ذخیره کنیم که مزایای زیادی دارد و باعث افزایش قدرت برنامه‌نویسی، امنیت در کد، و راحتی در برطرف کردن خطاها می‌شود. به این معنی که برای هر مقدار متناسب با نوع آن مقدار یک نوع دادۀ ویژه وجود دارد که بعد از تعریف کردن دیگر نمی‌توان نوع داده را تغییر داد. این ویژگی باعث بررسی و تحلیل دقیق‌تر کد و پیدا کردن ایرادات احتمالی در کد می‌شود؛ امنیت در برنامه بیشتر می‌شود به این معنی که از آسیب‌های امنیتی که مربوط به نوع داده است، جلوگیری می‌کند؛ رفتار برنامه پیش‌بینی‌پذیر می‌شود؛ امکان اشتباه به‌دلیل عدم تطابق نوع داده‌ها کمتر می‌شود؛ محیط برنامه‌نویسی جلوی بروز برخی از خطاهای مرتبط با نوع داده را می‌گیرد؛ برنامه کارایی بهتر و سریع‌تری خواهد داشت؛ محیط برنامه‌نویسی امکانات بیشتر و دقیق‌تری به ما ارائه می‌دهد، و موارد بسیار دیگر.

انواع داده های پرکاربرد

طبق قواعد سادۀ زیر نوع داده‌ها را تعریف می‌کنیم:

نوع مقدار مورد نظر

مثال

نوع داده

عدد صحیح

 123987 
-999000

int

عدد اعشاری

1895.001 
-566.1023

double

متن (رشته)

"Hello World"
"سلام سی‌شارپ"

string

بولین (درست/ نادرست)

true
false

bool

تمام این نوع های داده در خود زبان C# تعریف شده‌اند، به همین دلیل به آن‌ها نوع از پیش تعریف‌شده (built-in type) گفته می‌شود. 

نحوه تعریف و تخصیص مقدار به متغیر

قالب کلی برای تعریف متغیر و تخصیص مقدار به آن به شکل زیر است:

مقدار_متغیر = نام نوع_داده ;

برای مثال می‌خواهیم تعداد محصولاتی که در سبد خرید هستند داشته باشیم. چون تعداد عدد صحیح است، پس نوع داده int می‌شود و shoppingCartItemsCount را به‌عنوان نام متغیر انتخاب می‌کنیم و تعداد را به آن تخصیص می‌دهیم یعنی:

int shoppingCartItemsCount  = 3;

نگران طولانی بودن نام متغیر نباشید. نام‌گذاری متغیر‌ها باید به گونه‌ای باشد که هم قابل فهم باشد و هم با نگاه کردن به آن در هر جایی از کد متوجه ماهیت و کارایی آن شویم و برای این کار به بررسی کدهای قبل و بعد از آن نیازی نداشته باشیم.

نامی که برای متغیر انتخاب می‌کنید، باید قابل فهم و مرتبط با ماهیت متغیر باشد و به بررسی کدهای قبل و بعد متغیر نیازی نباشد.

برای مثال، با مشاهدۀ نام shoppingCartItemsCount می‌توان فهمید که این متغیر تعداد آیتم‌های موجود در سبد خرید را در خود نگه می‌دارد. اما اگر نام متغیر را x بگذاریم، متوجه هدف متغیر نمی‌شویم و برای این کار باید کدهای نوشته‌شدۀ قبل و بعد را بخوانیم.

در قطعه کد زیر مثال‌هایی برای تعریف و تخصیص مقدار به انواع متغیر‌ها را می‌بینیم:

int age = 67;
double height = 1.77;
string fullName = "Bill Gates";
bool isRich = true;

در این قطعه کد چند متغیر تعریف کرده‌ایم تا بعضی از اطلاعات یک فرد را نگه داریم. یک متغیر از نوع عدد صحیح به نام age تعریف کردیم و به آن عدد 67 را تخصیص دادیم. یک متغیر دیگر از نوع عدد اعشاری به نام height تعریف کردیم و به آن مقدار 1.77 را تخصیص دادیم و یک متغیر از نوع متن به نام fullName تعریف کردیم و متن 
"Bill Gates" را به آن اختصاص دادیم. در انتها، یک متغیر bool به نام isRich تعریف کردیم و مقدار true را به آن تخصیص دادیم.

همان‌طور که می‌دانید، می‌توانیم قد یک شخص را بر حسب سانتی‌متر مشخص کنیم (مثلاً 177 سانتی‌متر)، که در این صورت از نوع متغیر عدد صحیح (int) استفاده می‌کنیم و هم می‌توانیم به متر مشخص کنیم (مثلاً 1.77 متر) که در این صورت از نوع متغیر عدد اعشاری (double) استفاده می‌کنیم. ما در این مثال قد را به متر مشخص کردیم که برای وضوح بیشتر می‌توانیم نام متغیر را heightAsMeter انتخاب کنیم.

همان‌گونه که می‌بینید متن "Bill Gates" بین دو " " نوشته شده است. وقتی می‌خواهیم یک متغیر از نوع متن تعریف کنیم باید آن را بین دو علامت " " بنویسیم.

هنگام تعریف متغیر از نوع string، متن حتماً باید بین دو " " باشد.

در انتهای هر کدام از عبارات بالا از ; استفاده کرده‌ایم. ممکن است در نگاه اول کار اضافی به نظر آید، اما در ادامه خواهیم دید که در صورت نبود این قانون در C#، بعضی از کارها را نمی‌توانستیم به‌راحتی انجام دهیم.

حتما از علامت;  (Semicolonدر انتهای این عبارات استفاده کنید

وقتی یک متغیر را تعریف می‌کنیم، نیازی نیست حتماً همان موقع به آن متغیر مقدار تخصیص دهیم. می‌توانیم در ادامۀ کد مقدار آن را مشخص کنیم یا حتی مقدار جدیدی را به آن تخصیص دهیم.

در قطعه کد زیر ابتدا متغیر تعریف شده و در خط بعدی مقدار جدید به آن تخصیص داده شده است.

int rankOfWebsite;
rankOfWebsite = 3;
Console.WriteLine(rankOfWebsite);

این قطعه کد مقدار 3 را در کنسول نمایش می‌دهد.

قبل از این‌که یک متغیر نمایش داده شود یا در محاسباتی استفاده شود، باید مقداردهی شده باشد.

همچنین در قطعه کد زیر ابتدا متغیر تعریف شده و مقدار اولیه به آن تخصیص داده شده است، سپس در خط بعدی مقدار جدید به آن تخصیص داده شده است که به معنی جایگزینی با مقدار قبلی است.

int rankOfWebsite = 100;
rankOfWebsite = 3;
Console.WriteLine(rankOfWebsite);

این قطعه کد مقدار 3 را در کنسول نمایش می‌دهد.

در قطعه کد زیر هم ابتدا متغیر تعریف شده و مقدار اولیه به آن تخصیص داده شده است. همین مقدار در خط بعد در کنسول نوشته می‌شود. سپس در خط بعدی مقدار جدید به آن تخصیص داده شده است و مقدار جدید در کنسول نوشته می‌شود.

int rankOfWebsite = 100;
Console.WriteLine(rankOfWebsite);
rankOfWebsite = 3;
Console.WriteLine(rankOfWebsite);

این قطعه کد مقدار 100 را در کنسول نمایش می‌دهد و در خط بعدی در کنسول مقدار 3 را نمایش می‌دهد.

تا زمانی‌که مقدار جدید به متغیر تخصیص داده نشده است، در تمام محاسبات و نمایش‌ها از همان مقدار استفاده می‌شود.

  1. متغیرهایی برای نگهداری نام، نامخانوادگی، سن، قد، وزن، تعداد اعضای خانواده، و دختر یا پسر بودن تعریف کنید. اطلاعات خودتان را به آن تخصیص دهید و این اطلاعات را نمایش دهید.

  2. می‌خواهیم یک سبد خرید درست کنیم که باید مشخصاتی را که در ادامه می‌آید در خود نگه دارد. چه نوع متغیری برای هر کدام نیاز است و برای هر کدام یک نام قابل فهم و مرتبط با ماهیت متغیر تعریف کنید. مشخصاتی که نیاز داریم عبارت‌اند از: تعداد محصولات موجود در سبد خرید، قیمت کل سبد خرید، مبلغ تخفیف سبد خرید، نام کاربری که سبد خرید متعلق به اوست، و این‌که آیا سبد خرید جدید است.

نحوه استفاده از متغیر

همان‌طور که گفتیم، از کاربردهای تعریف متغیر این است که در ادامۀ برنامه بتوانیم از آن استفاده کنیم. برای مثال به جای این‌که متن مورد نظر خودمان را در پرانتز مربوط به Console.WriteLine() بنویسیم، می‌توانیم یک متغیر تعریف کنیم، متن را به آن متغیر تخصیص دهیم، و درنهایت متغیر را نمایش دهیم. یعنی به جای قطعه کد زیر:

Console.WriteLine("Hello World");

می‌توانیم بنویسیم:

string greeting = "Hello World";
Console.WriteLine(greeting);

در این قطعه کد یک متن (در این‌جا Hello World) در یک متغیر از نوع string قرار گرفته است که محتوای این متغیر در کنسول نمایش داده می‌شود. احتمالاً این سؤال پیش می‌آید که این روش در مقایسه با روش قبل طولانی‌تر است و همان روش اول راحت‌تر است. چرا باید به این نحو عمل کنیم؟ اما اجازه دهید با همین روش پیش رویم تا کم‌کم با مزایای زیاد آن آشنا شویم. از مزایای این روش این است که اگر بخواهیم از متغیر greeting در قسمت‌های دیگر برنامه استفاده کنیم (مثلاً در دو قسمت دیگر برنامه نمایش دهیم)، نیازی نیست که متن را در چند جا تکرار کنیم. اگر متن طولانی باشد، تکرار کردن به‌هیچ‌وجه راحت نیست.

اگر بیش از یک‌بار از یک مقدار استفاده می‌کنید، حتماً آن را به یک متغیر تخصیص دهید و سپس از متغیر مربوطه استفاده کنید.

همان‌طور که قبلاً گفته شد، متن را در بین دو علامت " " قرار می‌دهیم، اما دقت کنید که نام متغیر (در این‌جا greeting) را نباید بین دو علامت " " قرار داد.

متن داخل گیومه قرار می‌گیرد، اما نباید نام متغیر را هم داخل گیومه قرار دهیم.

حساس بودن به حروف کوچک و بزرگ

تمام متغیرها باید به همان نحو که تعریف شده‌اند، استفاده شوند. اگر متغیری را با حروف کوچک تعریف کردیم، نمی‌توانیم در موقع استفاده کردن از آن متغیر از حروف بزرگ استفاده کنیم. برای مثال قطعه کد زیر اشتباه است.

int height = 183;
Console.WriteLine(HEIGHT);

C#به کوچکی و بزرگی حروف (Case Sensitive) حساس است.

درنتیجه، می‌توان متغیرهایی تعریف کرد که فقط در کوچکی و بزرگی حروف با هم تفاوت داشته باشند. برای مثال، در قطعه کد زیر 3 متغیر با نام‌های متفاوت تعریف شده‌اند:

int age = 18;
int AGE = 80;
int Age = 50;

Console.WriteLine(AGE);
Console.WriteLine(Age);
Console.WriteLine(age);

در قطعه کد بالا، در خط اول کنسول عدد 80 نوشته می‌شود، در خط دوم کنسول عدد 50 نوشته می‌شود، و در خط سوم کنسول عدد 18 نوشته می‌شود.

تخصیص یکجا به چندین متغیر

همچنین برای تخصیص یک مقدار به چند متغیر، که یک نوع مشابه دارند، می‌توانیم با یک دستور به همۀ آن‌ها این مقدار را تخصیص دهیم.

قطعه کدهای زیر با هم برابرند:

int width;
int height;
width = 10;
height = 10;
-----------------
int width;
int height;
width = height = 10;

ضمناً می‌توانیم برای مقداردهی اولیۀ یک متغیر از هر عبارت معتبری استفاده کنیم.

قطعه کد زیر را در نظر بگیرید:

int lowestPrice = 1000000;
int highestPrice = 10000000;
int averagePrice = (lowestPrice + highestPrice) / 2;
Console.WriteLine(averagePrice);

که در این قطعه کد برای مقداردهی اولیه به متغیر averagePrice از دو متغیر lowestPrice و highestPrice، که قبل از این متغیر تعریف شده‌اند، استفاده کردیم.

بعد از تعریف متغیر، امکان استفاده از آن وجود دارد و نمی‌توانیم یک متغیر را قبل از تعریف استفاده کنیم.

تعریف و تخصیص یکجا به انواع داده های مشابه

هنگام تعریف متغیرها، در صورتی ‌که چند متغیر با یک نوع داده داشته باشیم، برای راحتی کار می‌توانیم همۀ آن‌ها را در یک دستور تعریف کنیم و به آن‌ها مقدار تخصیص دهیم و با از هم جدا کنیم.

قطعه کدهای زیر با هم برابرند:

string firstName = "Bill";
string lastName = "Gates";
string country = "US";
-----------------------------------------------
string firstName = "Bill", lastName = "Gates", country = "US";

  1. کد زیر را کوتاه‌تر کنید.

    int age = 67;
    int height = 177;
    bool isRich = true;
    bool isItalian = false;
    string firstName = "Bill";
    string lastName = "Gates";