eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
126 دنبال‌کننده
168 عکس
38 ویدیو
375 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
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) برقرار شود.
20 استفاده از توابع بازگشتی به جای حلقه‌ها در برنامه‌نویسی می‌تواند در برخی موارد مفید باشد، به ویژه زمانی که مسئله به طور طبیعی به صورت بازگشتی تعریف می‌شود. برای مثال، مسائل مربوط به درخت‌ها و گراف‌ها اغلب با استفاده از توابع بازگشتی ساده‌تر حل می‌شوند. در زیر یک مثال از استفاده از تابع بازگشتی برای محاسبه مجموع اعداد یک آرایه آورده شده است: using System; namespace RecursiveSum { class Program { static void Main(string[] args) { int[] numbers = { 1, 2, 3, 4, 5 }; Console.WriteLine($"Sum of array: {Sum(numbers, numbers.Length)}"); Console.ReadKey(); } static int Sum(int[] arr, int n) { if (n <= 0) return 0; else return arr[n - 1] + Sum(arr, n - 1); } } } در این مثال، تابع Sum به صورت بازگشتی مجموع اعداد آرایه را محاسبه می‌کند. اگر طول آرایه صفر باشد، تابع مقدار 0 را برمی‌گرداند. در غیر این صورت، آخرین عنصر آرایه را به مجموع بازگشتی بقیه عناصر اضافه می‌کند. استفاده از توابع بازگشتی می‌تواند کد را خواناتر و ساده‌تر کند، اما باید به مدیریت حافظه و جلوگیری از بازگشت‌های بی‌نهایت توجه داشت.
21 در اینجا یک مثال دیگر از استفاده از توابع بازگشتی برای حل مسئله فیبوناچی آورده شده است. دنباله فیبوناچی به این صورت است که هر عدد برابر با مجموع دو عدد قبلی خود است. به عنوان مثال، دنباله فیبوناچی به این صورت شروع می‌شود: 0, 1, 1, 2, 3, 5, 8, ... در زیر یک مثال از تابع بازگشتی برای محاسبه عدد فیبوناچی آورده شده است: using System; namespace FibonacciExample { class Program { static void Main(string[] args) { int n = 10; Console.WriteLine($"Fibonacci of {n} is {Fibonacci(n)}"); Console.ReadKey(); } static int Fibonacci(int n) { if (n <= 1) return n; else return Fibonacci(n - 1) + Fibonacci(n - 2); } } } در این مثال، تابع Fibonacci به صورت بازگشتی دو مقدار قبلی دنباله را محاسبه می‌کند و آن‌ها را با هم جمع می‌کند تا مقدار فعلی را به دست آورد. اگر n کمتر یا مساوی 1 باشد، تابع مقدار n را برمی‌گرداند که شرط پایان (base case) است.