8
در سیشارپ، توابع سراسری (Global Functions) به توابعی اشاره دارند که میتوانند در هر جایی از برنامه بدون نیاز به ایجاد یک نمونه از کلاس فراخوانی شوند. این توابع معمولاً به عنوان توابع استاتیک در کلاسهای استاتیک تعریف میشوند. از نسخه C# 9.0 به بعد، میتوانید از Top-level Statements برای تعریف توابع سراسری استفاده کنید.
مثال با استفاده از کلاس استاتیکدر اینجا یک مثال از تعریف و استفاده از یک تابع سراسری در یک کلاس استاتیک آورده شده است:
using System;
namespace Example
{
static class GlobalFunctions
{
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
}
class Program
{
static void Main(string[] args)
{
GlobalFunctions.PrintMessage("Hello, World!");
Console.ReadKey();
}
}
}
مثال با استفاده از Top-level Statementsدر اینجا یک مثال از استفاده از Top-level Statements برای تعریف توابع سراسری آورده شده است:
using System;
void PrintMessage(string message)
{
Console.WriteLine(message);
}
PrintMessage("Hello, World!");
در این مثال، تابع PrintMessage به صورت مستقیم در سطح بالا تعریف شده و میتواند بدون نیاز به کلاس فراخوانی شود.
9
Top-level Statements
یکی از ویژگیهای جدید سیشارپ است که از نسخه 9.0 معرفی شده است. این ویژگی به شما اجازه میدهد تا کدهای اجرایی را مستقیماً در سطح بالای فایل بنویسید، بدون نیاز به تعریف کلاس یا متد Main. این ویژگی به ویژه برای برنامههای کوچک و اسکریپتها مفید است.
مزایای Top-level Statements
1- سادگی و کاهش کد: نیازی به تعریف کلاس و متد Main نیست، که باعث کاهش کدهای اضافی میشود.
2- شروع سریع: برای پروژههای کوچک و آزمایشی، میتوانید سریعتر کد بنویسید و اجرا کنید.
3- خوانایی بهتر: کدهای اصلی برنامه به صورت مستقیم و بدون پیچیدگیهای اضافی نوشته میشوند.
مثال سادهدر اینجا یک مثال ساده از استفاده از Top-level Statements آورده شده است:
using System;
Console.WriteLine("Hello, World!");
void PrintMessage(string message)
{
Console.WriteLine(message);
}
PrintMessage("This is a top-level statement example.");
قوانین و محدودیتها
1- فقط یک فایل: تنها یک فایل در پروژه میتواند شامل Top-level Statements باشد. اگر در بیش از یک فایل از این ویژگی استفاده کنید، کامپایلر خطا میدهد.
2- استفاده از using: دستورات using باید در ابتدای فایل قرار گیرند.
3- تعریف کلاسها و namespaceها: میتوانید کلاسها و namespaceها را نیز در فایل شامل Top-level Statements تعریف کنید، اما باید بعد از این دستورات بیایند.
کاربردها
- اسکریپتها و ابزارهای کوچک: برای نوشتن ابزارهای کوچک و اسکریپتها که نیاز به ساختار پیچیده ندارند.
- آموزش و یادگیری: برای مبتدیان که میخواهند سریعتر با سیشارپ آشنا شوند و کد بنویسند.
: Top-level statements tutorial - C# | Microsoft Learn
: Top-level statements - programs without Main methods - C# | Microsoft Learn
10
البته! بیایید نگاهی دقیقتر به توابع و Top-level Statements در سیشارپ بیندازیم.
توابع در سیشارپتوابع (یا متدها) بلوکهای کدی هستند که وظایف خاصی را انجام میدهند و میتوانند بارها در برنامه فراخوانی شوند. توابع میتوانند مقادیر ورودی (پارامترها) دریافت کنند و یک مقدار خروجی (بازگشتی) داشته باشند. در اینجا چند نوع تابع را بررسی میکنیم:
- توابع بدون بازگشت (Void Functions):
این توابع هیچ مقداری را بازنمیگردانند و از نوع void استفاده میکنند.
void PrintMessage(string message)
{
Console.WriteLine(message);
}
- توابع با بازگشت (Return Functions):
این توابع یک مقدار را بازمیگردانند و نوع بازگشتی آنها مشخص میشود.
int Sum(int a, int b)
{
return a + b;
}
- توابع استاتیک (Static Functions):
این توابع به یک نمونه از کلاس نیاز ندارند و میتوانند مستقیماً از طریق نام کلاس فراخوانی شوند.
static void PrintMessage(string message)
{
Console.WriteLine(message);
}
Top-level StatementsTop-level Statements
به شما اجازه میدهند تا کدهای اجرایی را مستقیماً در سطح بالای فایل بنویسید، بدون نیاز به تعریف کلاس یا متد Main. این ویژگی از نسخه C# 9.0 معرفی شده است و به ویژه برای برنامههای کوچک و اسکریپتها مفید است.
مثال کامل با Top-level Statementsدر اینجا یک مثال کامل از استفاده از Top-level Statements آورده شده است که شامل تعریف و استفاده از توابع است:
using System;
// تابع اصلی که برنامه را اجرا میکند
Console.WriteLine("Hello, World!");
// تعریف یک تابع برای چاپ پیام
void PrintMessage(string message)
{
Console.WriteLine(message);
}
// فراخوانی تابع PrintMessage
PrintMessage("This is a top-level statement example.");
// تعریف یک تابع برای جمع دو عدد
int Sum(int a, int b)
{
return a + b;
}
// استفاده از تابع Sum و چاپ نتیجه
int result = Sum(5, 10);
Console.WriteLine("Sum: " + result);
نکات مهم- سادگی: نیازی به تعریف کلاس و متد Main نیست.
- استفاده از توابع: میتوانید توابع را به صورت مستقیم در سطح بالا تعریف و استفاده کنید.
- محدودیتها: تنها یک فایل در پروژه میتواند شامل Top-level Statements باشد.
11
البته! بیایید به جزئیات بیشتری در مورد استفاده از توابع در سیشارپ بپردازیم.
تعریف و استفاده از توابع در سیشارپ به شما اجازه میدهند تا کدهای تکراری را در یک مکان متمرکز کنید و آنها را بارها در برنامه فراخوانی کنید. این کار باعث افزایش خوانایی و نگهداری کد میشود.
ساختار یک تابعیک تابع در سیشارپ شامل بخشهای زیر است:
- نوع بازگشتی: نوع دادهای که تابع بازمیگرداند. اگر تابع هیچ مقداری بازنگرداند، از void استفاده میشود.
- نام تابع: نامی که برای فراخوانی تابع استفاده میشود.
- پارامترها: ورودیهایی که تابع دریافت میکند. این ورودیها در داخل پرانتز تعریف میشوند.
- بدنه تابع: بلوک کدی که وظیفه تابع را انجام میدهد.
مثالهای مختلف از توابعتابع بدون بازگشت و بدون پارامتراین نوع تابع هیچ مقداری را بازنمیگرداند و هیچ پارامتری دریافت نمیکند:
void PrintHello()
{
Console.WriteLine("Hello, World!");
}
فراخوانی تابع:
PrintHello();
تابع با بازگشت و بدون پارامتراین نوع تابع یک مقدار را بازمیگرداند ولی هیچ پارامتری دریافت نمیکند:
int GetNumber()
{
return 42;
}
فراخوانی تابع و استفاده از مقدار بازگشتی:
int number = GetNumber();
Console.WriteLine(number);
تابع با بازگشت و با پارامتراین نوع تابع یک مقدار را بازمیگرداند و پارامترهایی دریافت میکند:
int Sum(int a, int b)
{
return a + b;
}
فراخوانی تابع و استفاده از مقدار بازگشتی:
int result = Sum(5, 10);
Console.WriteLine("Sum: " + result);
ارسال آرایه به تابعشما میتوانید آرایهها را نیز به توابع ارسال کنید. در اینجا یک مثال از ارسال یک آرایه به تابع آورده شده است:
void PrintArray(int[] array)
{
foreach (int number in array)
{
Console.WriteLine(number);
}
}
فراخوانی تابع با آرایه:
int[] numbers = { 1, 2, 3, 4, 5 };
PrintArray(numbers);
توابع بازگشتی آرایههمچنین میتوانید توابعی تعریف کنید که آرایهای از دادهها را بازمیگردانند:
int[] GetNumbers()
{
return new int[] { 1, 2, 3, 4, 5 };
}
فراخوانی تابع و استفاده از آرایه بازگشتی:
int[] numbers = GetNumbers();
foreach (int number in numbers)
{
Console.WriteLine(number);
}
توابع استاتیکتوابع استاتیک به شما اجازه میدهند تا بدون نیاز به ایجاد یک نمونه از کلاس، آنها را فراخوانی کنید. این توابع معمولاً برای وظایف عمومی و سراسری استفاده میشوند:
static void PrintMessage(string message)
{
Console.WriteLine(message);
}
فراخوانی تابع استاتیک:
PrintMessage("Hello from a static method!");
Top-level Statements
همانطور که قبلاً توضیح داده شد، Top-level Statements به شما اجازه میدهند تا کدهای اجرایی را مستقیماً در سطح بالای فایل بنویسید. این ویژگی به ویژه برای برنامههای کوچک و اسکریپتها مفید است.
مثال کامل با Top-level Statements و توابع
using System;
Console.WriteLine("Hello, World!");
void PrintMessage(string message)
{
Console.WriteLine(message);
}
PrintMessage("This is a top-level statement example.");
int Sum(int a, int b)
{
return a + b;
}
int result = Sum(5, 10);
Console.WriteLine("Sum: " + result);
12
البته! بیایید به جزئیات بیشتری در مورد Top-level Statements در سیشارپ بپردازیم.
Top-level Statements چیست؟
و Top-level Statements به شما اجازه میدهند تا کدهای اجرایی را مستقیماً در سطح بالای فایل بنویسید، بدون نیاز به تعریف کلاس یا متد Main. این ویژگی از نسخه C# 9.0 معرفی شده است و به ویژه برای برنامههای کوچک و اسکریپتها مفید است.
مزایای استفاده از Top-level Statements- سادگی و کاهش کد: نیازی به تعریف کلاس و متد Main نیست، که باعث کاهش کدهای اضافی میشود.
- شروع سریع: برای پروژههای کوچک و آزمایشی، میتوانید سریعتر کد بنویسید و اجرا کنید.
- خوانایی بهتر: کدهای اصلی برنامه به صورت مستقیم و بدون پیچیدگیهای اضافی نوشته میشوند.
ساختار Top-level Statementsدر یک فایل با Top-level Statements، شما میتوانید کدهای اجرایی، توابع، و دستورات using را به صورت مستقیم بنویسید. در اینجا یک مثال ساده آورده شده است:
using System;
Console.WriteLine("Hello, World!");
void PrintMessage(string message)
{
Console.WriteLine(message);
}
PrintMessage("This is a top-level statement example.");
int Sum(int a, int b)
{
return a + b;
}
int result = Sum(5, 10);
Console.WriteLine("Sum: " + result);
قوانین و محدودیتها- فقط یک فایل: تنها یک فایل در پروژه میتواند شامل Top-level Statements باشد. اگر در بیش از یک فایل از این ویژگی استفاده کنید، کامپایلر خطا میدهد.
- استفاده از using: دستورات using باید در ابتدای فایل قرار گیرند.
- تعریف کلاسها و namespaceها: میتوانید کلاسها و namespaceها را نیز در فایل شامل Top-level Statements تعریف کنید، اما باید بعد از این دستورات بیایند.
کاربردها- اسکریپتها و ابزارهای کوچک: برای نوشتن ابزارهای کوچک و اسکریپتها که نیاز به ساختار پیچیده ندارند.
- آموزش و یادگیری: برای مبتدیان که میخواهند سریعتر با سیشارپ آشنا شوند و کد بنویسند.
مثال کامل با Top-level Statementsدر اینجا یک مثال کامل از استفاده از Top-level Statements آورده شده است که شامل تعریف و استفاده از توابع است:
using System;
Console.WriteLine("Hello, World!");
void PrintMessage(string message)
{
Console.WriteLine(message);
}
PrintMessage("This is a top-level statement example.");
int Sum(int a, int b)
{
return a + b;
}
int result = Sum(5, 10);
Console.WriteLine("Sum: " + result);
در این مثال:
- ابتدا یک پیام به کنسول چاپ میشود.
- سپس یک تابع PrintMessage تعریف شده و فراخوانی میشود.
- یک تابع Sum تعریف شده که دو عدد را جمع میکند و نتیجه آن چاپ میشود.
13
در سی شارپ، کلمه کلیدی public برای تعیین سطح دسترسی (access modifier) استفاده میشود. وقتی یک متغیر، تابع، یا کلاس با public تعریف میشود، به این معنی است که آن عضو از هر جای دیگری در برنامه قابل دسترسی است. به عنوان مثال:
using System;
namespace Example
{
public class Person
{
public string Name;
public int Age;
public void DisplayInfo()
{
Console.WriteLine("Name: " + Name);
Console.WriteLine("Age: " + Age);
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice";
person.Age = 30;
person.DisplayInfo();
Console.ReadKey();
}
}
}
در این مثال، کلاس Person و اعضای آن (Name، Age و DisplayInfo) با public تعریف شدهاند، بنابراین از هر جای دیگری در برنامه قابل دسترسی هستند.
14
در سیشارپ، کلمه کلیدی public یکی از دستورات دسترسی (Access Modifiers) است که برای تعیین سطح دسترسی اعضای کلاسها، متدها، و متغیرها استفاده میشود. وقتی یک عضو با کلمه کلیدی public تعریف میشود، آن عضو از هر جایی در برنامه قابل دسترسی است.
مثالهای استفاده از publicکلاسها و متدهادر اینجا یک مثال از تعریف یک کلاس و متد public آورده شده است:
public class Person
{
public string Name { get; set; }
public void PrintName()
{
Console.WriteLine("Name: " + Name);
}
}
در این مثال:
- کلاس Person به صورت public تعریف شده است، بنابراین از هر جایی در برنامه قابل دسترسی است.
- متغیر Name و متد PrintName نیز به صورت public تعریف شدهاند، بنابراین میتوان از هر جایی در برنامه به آنها دسترسی داشت.
استفاده از کلاس و متد publicدر اینجا نحوه استفاده از کلاس و متد public آورده شده است:
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "John Doe";
person.PrintName();
}
}
در این مثال:
- یک نمونه از کلاس Person ایجاد شده است.
- متغیر Name تنظیم شده و متد PrintName فراخوانی شده است.
دستورات دسترسی دیگرعلاوه بر public، دستورات دسترسی دیگری نیز وجود دارند که سطح دسترسی متفاوتی را تعیین میکنند:
یک- private: فقط از داخل همان کلاس قابل دسترسی است.
دو- protected: از داخل همان کلاس و کلاسهای مشتق شده قابل دسترسی است.
سه- internal: فقط از داخل همان اسمبلی (Assembly) قابل دسترسی است.
چهار- protected internal: از داخل همان اسمبلی و کلاسهای مشتق شده قابل دسترسی است.
پنج- private protected: از داخل همان کلاس و کلاسهای مشتق شده در همان اسمبلی قابل دسترسی است.
15
برای ساخت یک ماشین حساب ساده در سی شارپ که کاربر بتواند دو عدد وارد کند و عملگرهای جمع، تفریق، ضرب و تقسیم را انتخاب کند، میتوانید از کد زیر استفاده کنید:
using System;
namespace CalculatorApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter the first number:");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter the second number:");
double num2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter an operator (+, -, *, /):");
char op = Console.ReadLine()[0];
double result = 0;
switch (op)
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 != 0)
{
result = num1 / num2;
}
else
{
Console.WriteLine("Cannot divide by zero.");
return;
}
break;
default:
Console.WriteLine("Invalid operator.");
return;
}
Console.WriteLine("Result: " + result);
Console.ReadKey();
}
}
}
در این برنامه، ابتدا از کاربر خواسته میشود که دو عدد و یک عملگر را وارد کند. سپس با استفاده از یک ساختار switch، عملیات مورد نظر انجام شده و نتیجه به کاربر نمایش داده میشود.
16
برای ساخت یک ماشین حساب با استفاده از توابع در سی شارپ، میتوانید از کد زیر استفاده کنید:
using System;
namespace CalculatorApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter the first number:");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter the second number:");
double num2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter an operator (+, -, *, /):");
char op = Console.ReadLine()[0];
double result = Calculate(num1, num2, op);
if (!double.IsNaN(result))
{
Console.WriteLine("Result: " + result);
}
Console.ReadKey();
}
static double Calculate(double a, double b, char op)
{
switch (op)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b != 0)
{
return a / b;
}
else
{
Console.WriteLine("Cannot divide by zero.");
return double.NaN;
}
default:
Console.WriteLine("Invalid operator.");
return double.NaN;
}
}
}
}
در این برنامه، تابع Calculate برای انجام عملیات ریاضی استفاده میشود. این تابع سه پارامتر a، b و op را میگیرد و بر اساس عملگر op، عملیات مناسب را انجام میدهد و نتیجه را برمیگرداند.
17
static void Main(string[] args)
{
int k;
while(true)
{
Console.Write(" \n1=salam 2=Khodahafrz 3=exit ");
k = Convert.ToInt32(Console.ReadLine());
switch(k){
case 1: Console.Write("\nSalam\n");
break;
case 2: Console.Write("\nKhodahafez\n");
break;
case 3: return;
}
}
ساخت منو و وقتی return را بزنید از حلقه خارج می شوید و
Console.ReadKey();
لازم نیست بنویسید
18
توابع همنام یا Overloading در سیشارپ به شما این امکان را میدهند که چندین تابع با نام یکسان اما با پارامترهای متفاوت تعریف کنید. این قابلیت به شما اجازه میدهد تا توابعی با رفتارهای مختلف اما با یک نام مشترک داشته باشید. برای مثال، میتوانید یک تابع Sum داشته باشید که دو عدد صحیح را جمع میکند و یک تابع دیگر با همان نام که سه عدد صحیح را جمع میکند.
در زیر یک مثال ساده از توابع همنام در سیشارپ آورده شده است:
using System;
namespace OverloadingExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Sum(5, 10)); // خروجی: 15
Console.WriteLine(Sum(5, 10, 15)); // خروجی: 30
Console.ReadKey();
}
static int Sum(int a, int b)
{
return a + b;
}
static int Sum(int a, int b, int c)
{
return a + b + c;
}
}
}
در این مثال، دو تابع Sum تعریف شدهاند که یکی دو پارامتر و دیگری سه پارامتر میپذیرد. هنگام فراخوانی تابع، کامپایلر بر اساس تعداد و نوع پارامترها تصمیم میگیرد که کدام تابع را اجرا کند.
19
توابع بازگشتی (Recursive Functions) توابعی هستند که خودشان را فراخوانی میکنند. این نوع توابع برای حل مسائل پیچیده با تقسیم آنها به زیرمسائل سادهتر بسیار مفید هستند. یکی از معروفترین مثالهای توابع بازگشتی، محاسبه فاکتوریل یک عدد است.
در زیر یک مثال ساده از تابع بازگشتی برای محاسبه فاکتوریل در سیشارپ آورده شده است:
using System;
namespace RecursiveExample
{
class Program
{
static void Main(string[] args)
{
int number = 5;
Console.WriteLine($"Factorial of {number} is {Factorial(number)}");
Console.ReadKey();
}
static int Factorial(int n)
{
if (n <= 1)
return 1;
else
return n * Factorial(n - 1);
}
}
}
در این مثال، تابع Factorial خودش را فراخوانی میکند تا زمانی که مقدار n به 1 یا کمتر برسد. این فرآیند بازگشتی ادامه مییابد تا زمانی که شرط پایان (base case) برقرار شود.