20
یک مثال
اینترفیس
namespace ConsoleApp5
{
internal interface IMyInterface
{
string HelloUser(string name);
}
}
کلاس Person
namespace ConsoleApp5
{
class Person:IMyInterface
{
public string HelloUser(string name)
{
return "Hello " + name;
}
}
}
و کلاس Program
namespace ConsoleApp5
{
class Program
{
static void Main(string[] args)
{
Person hi = new Person();
Console.WriteLine(hi.HelloUser("alireza panahi"));
Console.ReadKey();
}
}
}
21
در اینجا می توانیم اینترفیس interface را انتخاب کرد
22
چند ریختی (Polymorphism) در سی شارپ به معنای توانایی یک شیء برای ایفای نقشهای مختلف است. این مفهوم به دو نوع اصلی تقسیم میشود: چند ریختی استاتیک و چند ریختی پویا.
چند ریختی استاتیکدر چند ریختی استاتیک، نوع تابع در زمان کامپایل مشخص میشود. دو روش اصلی برای پیادهسازی چند ریختی استاتیک در سی شارپ عبارتند از:
- Function Overloading: تعریف چندین تابع با نام یکسان اما با پارامترهای متفاوت.
- Operator Overloading: تعریف مجدد عملگرها برای استفاده با انواع دادههای سفارشی.
مثال:
using System;
namespace PolymorphismApplication {
class Printdata {
void print(int i) {
Console.WriteLine("Printing int: {0}", i);
}
void print(double f) {
Console.WriteLine("Printing float: {0}", f);
}
void print(string s) {
Console.WriteLine("Printing string: {0}", s);
}
static void Main(string[] args) {
Printdata p = new Printdata();
p.print(5);
p.print(500.263);
p.print("Hello C#");
Console.ReadKey();
}
}
}
چند ریختی پویادر چند ریختی پویا، نوع تابع در زمان اجرا مشخص میشود. این نوع چند ریختی معمولاً با استفاده از کلاسهای abstract و اینترفیسها پیادهسازی میشود.
مثال:
using System;
namespace PolymorphismApplication {
abstract class Shape {
public abstract int area();
}
class Rectangle : Shape {
private int length;
private int width;
public Rectangle(int a = 0, int b = 0) {
length = a;
width = b;
}
public override int area() {
Console.WriteLine("Rectangle class area:");
return (width * length);
}
}
class RectangleTester {
static void Main(string[] args) {
Rectangle r = new Rectangle(10, 7);
double a = r.area();
Console.WriteLine("Area: {0}", a);
}
}
}
این مثالها نشان میدهند که چگونه میتوان از چند ریختی برای ایجاد کدهای انعطافپذیر و قابل توسعه استفاده کرد.
23
اینترفیسها (Interfaces) در سی شارپ نقش مهمی در پیادهسازی چند ریختی (Polymorphism) دارند. اینترفیسها به شما اجازه میدهند تا قراردادهایی را تعریف کنید که کلاسها باید از آنها پیروی کنند. این ویژگی به شما امکان میدهد تا کدهای انعطافپذیر و قابل توسعهای بنویسید.
تعریف اینترفیساینترفیسها شامل اعلان متدها و خواص هستند، اما هیچ پیادهسازیای ندارند. کلاسهایی که از اینترفیسها ارثبری میکنند، باید تمامی متدها و خواص تعریفشده در اینترفیس را پیادهسازی کنند.
مثال:
using System;
namespace InterfaceExample {
interface IShape {
int Area();
}
class Rectangle : IShape {
private int length;
private int width;
public Rectangle(int l, int w) {
length = l;
width = w;
}
public int Area() {
return length * width;
}
}
class Circle : IShape {
private int radius;
public Circle(int r) {
radius = r;
}
public int Area() {
return (int)(Math.PI * radius * radius);
}
}
class Program {
static void Main(string[] args) {
IShape rect = new Rectangle(10, 7);
IShape circ = new Circle(5);
Console.WriteLine("Rectangle Area: " + rect.Area());
Console.WriteLine("Circle Area: " + circ.Area());
}
}
}
چند ریختی با اینترفیسهادر این مثال، اینترفیس IShape تعریف شده است که شامل متد Area است. کلاسهای Rectangle و Circle اینترفیس IShape را پیادهسازی میکنند و متد Area را به صورت خاص خودشان تعریف میکنند. در برنامه اصلی، میتوانیم از نوع IShape برای نگهداری اشیاء مختلف استفاده کنیم و متد Area را بدون توجه به نوع دقیق شیء فراخوانی کنیم. این ویژگی همان چند ریختی است که به ما اجازه میدهد تا با اشیاء مختلف به صورت یکسان رفتار کنیم.
24
چند ریختی با اینترفیس
IMyInterface i2 = new child();
اینترفیس میتواند به تمام فرزند های خودش تغییر قیافه بدهد
اینترفیس تبدیل شد به نمونه ای از child
25
یک مثال دیگر در مورد GenericList
class Person
{
public string Name { get; set; }
public string Family { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Person> people = new List<Person>();
Person p1 = new Person();
p1.Name = "Iman";
p1.Family = "Madaeny";
p1.Age = 30;
people.Add(p1);
Person p2 = new Person();
p2.Name = "Parham";
p2.Family = "Madaeny";
p2.Age = 4;
people.Add(p2);
foreach (Person p in people)
{
Console.WriteLine($"Name : {p.Name} Family : {p.Family} Age :{p.Age}");
}
Console.ReadKey();
}
}
26
ساخت ساعت شمسی
در سیشارپ، کلاس PersianCalendar در فضای نام System.Globalization برای کار با تقویم شمسی استفاده میشود. این کلاس به شما امکان میدهد تا تاریخها را در تقویم شمسی محاسبه و مدیریت کنید.
using MyAssembly;
using System;
using System.Collections.Generic;
using System.Globalization; // این مربوط به زبان ها هستند
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NameSpace_Example
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);
PersianCalendar persian = new PersianCalendar(); // با استفاده از این می توانیم تاریخ را شمسی کنیم
string persianDate = persian.GetYear(DateTime.Now) + "/" + persian.GetMonth(DateTime.Now) + "/" + persian.GetDayOfMonth(DateTime.Now);
Console.WriteLine(persianDate);
Console.ReadKey();
27
در سی شارپ، فضای نام (Namespace) برای سازماندهی کد و جلوگیری از تداخل نامها استفاده میشود. با استفاده از فضای نام، میتوانید کلاسها، اینترفیسها، و دیگر اعضای کد را در گروههای منطقی دستهبندی کنید.
برای تعریف یک فضای نام، از کلمه کلیدی namespace استفاده میشود. به عنوان مثال:
namespace MyNamespace
{
class MyClass
{
public void MyMethod()
{
Console.WriteLine("Hello from MyNamespace!");
}
}
}
برای دسترسی به اعضای یک فضای نام، از عملگر نقطه (.) استفاده میشود:
MyNamespace.MyClass obj = new MyNamespace.MyClass();
obj.MyMethod();
همچنین میتوانید از کلمه کلیدی using برای سادهتر کردن دسترسی به فضای نامها استفاده کنید:
using MyNamespace;
class Program
{
static void Main()
{
MyClass obj = new MyClass();
obj.MyMethod();
}
}
فضاهای نام میتوانند تو در تو نیز باشند:
namespace OuterNamespace
{
namespace InnerNamespace
{
class MyClass
{
public void MyMethod()
{
Console.WriteLine("Hello from InnerNamespace!");
}
}
}
}
در این مثال، برای دسترسی به کلاس MyClass در فضای نام داخلی، باید از نام کامل آن استفاده کنید:
OuterNamespace.InnerNamespace.MyClass obj = new OuterNamespace.InnerNamespace.MyClass();
obj.MyMethod();
28
در سی شارپ، دستور using دو کاربرد اصلی دارد:
- مدیریت منابع: برای اطمینان از آزادسازی منابع پس از استفاده، مانند فایلها، اتصالات شبکه، و غیره. این دستور به طور خودکار متد Dispose را فراخوانی میکند تا منابع آزاد شوند. ساختار کلی آن به صورت زیر است:
using (var resource = new Resource())
{
// استفاده از resource
}
// در اینجا resource به طور خودکار Dispose میشود
مثال:
using (var file = new StreamWriter("example.txt"))
{
file.WriteLine("Hello, World!");
}
// فایل به طور خودکار بسته میشود
- فضاهای نام (Namespaces): برای وارد کردن فضاهای نام در ابتدای فایلهای کد، به طوری که نیازی به نوشتن کامل نام کلاسها نباشد. این کار خوانایی کد را افزایش میدهد.
using System;
using System.Collections.Generic;
همچنین در سی شارپ 10 به بعد، میتوانید از global using استفاده کنید تا فضاهای نام به صورت سراسری در کل پروژه در دسترس باشند.
// در یک فایل جداگانه
global using System.Data;
سپس میتوانید در هر فایل دیگری از پروژه از این فضای نام استفاده کنید بدون نیاز به تعریف مجدد آن.
29
در سی شارپ 8.0، سینتکس جدیدی برای استفاده از using معرفی شده است که کار با منابع را سادهتر میکند. در این نسخه، میتوانید از using به صورت مستقیم درون یک بلاک کد استفاده کنید بدون نیاز به تعریف یک بلاک جدید. به عنوان مثال:
using var stream = new FileStream("file.txt", FileMode.Open);
این سینتکس جدید باعث میشود که منابع به صورت خودکار در پایان دامنه متغیر آزاد شوند، حتی اگر خطایی رخ دهد.
30
در سی شارپ 12، دستور using برای مدیریت منابع و آزاد کردن حافظه به کار میرود. این دستور به شما اجازه میدهد تا اشیاء را به صورت خودکار پس از استفاده از حافظه پاک کنید. ساختار کلی دستور using به صورت زیر است:
using (var resource = new Resource())
{
// کدهایی که از resource استفاده میکنند
}
در این مثال، پس از اتمام بلاک using، متد Dispose شیء resource به صورت خودکار فراخوانی میشود و حافظه آزاد میگردد.
همچنین، در سی شارپ 10 و نسخههای بعدی، میتوانید از global using استفاده کنید تا فضاهای نام (namespaces) را به صورت سراسری در کل پروژه تعریف کنید. به عنوان مثال:
// در یک فایل جداگانه
global using System;
global using System.Collections.Generic;
این کار باعث میشود که نیازی به تعریف مجدد این فضاهای نام در هر فایل نباشد.