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;
این کار باعث میشود که نیازی به تعریف مجدد این فضاهای نام در هر فایل نباشد.
31
در سی شارپ، کلمه کلیدی partial به شما اجازه میدهد که تعریف یک کلاس، ساختار، یا اینترفیس را در چندین فایل جداگانه تقسیم کنید. این ویژگی به ویژه در پروژههای بزرگ و تیمهای بزرگ برنامهنویسی که نیاز به تقسیم وظایف دارند، مفید است.
مثال از کلاس partialفرض کنید میخواهید یک کلاس به نام Person را در دو فایل جداگانه تعریف کنید:
فایل اول (Person1.cs):
public partial class Person
{
public string FirstName { get; set; }
}
فایل دوم (Person2.cs):
public partial class Person
{
public string LastName { get; set; }
}
هنگامی که این دو فایل کامپایل میشوند، کلاس Person به یک کلاس واحد با دو خاصیت FirstName و LastName تبدیل میشود:
Person person = new Person { FirstName = "Ehsan", LastName = "Babaei" };
Console.WriteLine($"Full Name: {person.FirstName} {person.LastName}");
// prints "Full Name: Ehsan Babaei"
مزایا و معایب کلاسهای partialمزایا:
- تقسیم یک کلاس به چندین فایل، که میتواند در پروژههای بزرگ مفید باشد.
- امکان ترکیب کد تولید شده توسط ابزارها با کد خودتان بدون نیاز به تغییر کد تولید شده.
- تسهیل تقسیم وظایف برنامهنویسی بین تیمهای بزرگ.
معایب:
- ممکن است منجر به کدی شود که خواندن آن دشوار است.
- مدیریت کد ممکن است پیچیدهتر شود، زیرا تغییرات در یک قسمت از کلاس میتواند تأثیر غیرمستقیمی بر بخشهای دیگر داشته باشد.
32
در سیشارپ، کلمه کلیدی internal یک سطح دسترسی است که برای انواع (types) و اعضای (members) کلاسها استفاده میشود. اعضا یا انواعی که با internal مشخص شدهاند، فقط در داخل همان اسمبلی (assembly) قابل دسترسی هستند و از خارج از آن اسمبلی قابل مشاهده نیستند.
برای مثال:
// Assembly1.cs
internal class MyClass
{
internal int myField;
internal void MyMethod()
{
// Method implementation
}
}
در این مثال، کلاس MyClass و اعضای آن فقط در داخل اسمبلیای که این کد در آن قرار دارد، قابل دسترسی هستند. اگر بخواهید از این کلاس یا اعضای آن در اسمبلی دیگری استفاده کنید، با خطا مواجه خواهید شد.
33
در سیشارپ، برخی از کلاسها به گونهای طراحی شدهاند که نمیتوان از آنها نمونهسازی کرد. این کلاسها معمولاً به دلایل زیر به صورت غیرقابل نمونهسازی تعریف میشوند:
1- کلاسهای ایستا (Static Classes): این کلاسها فقط شامل اعضای ایستا هستند و نمیتوان از آنها نمونهسازی کرد. به عنوان مثال، کلاس Math در سیشارپ یک کلاس ایستا است و شما نمیتوانید از آن نمونهسازی کنید.
2- کلاسهای انتزاعی (Abstract Classes): این کلاسها برای ایجاد یک پایه برای سایر کلاسها طراحی شدهاند و نمیتوان مستقیماً از آنها نمونهسازی کرد. شما باید یک کلاس فرزند از کلاس انتزاعی ایجاد کنید و سپس از کلاس فرزند نمونهسازی کنید.
3- کلاسهای دارای سازندههای خصوصی (Private Constructors): اگر یک کلاس دارای سازندههای خصوصی باشد، نمیتوان از خارج از کلاس از آن نمونهسازی کرد. این روش معمولاً برای پیادهسازی الگوهای طراحی مانند Singleton استفاده میشود.
34
برای استفاده از کلاسهایی که نمیتوان از آنها نمونهسازی کرد، میتوانید به روشهای زیر عمل کنید:
1- کلاسهای ایستا (Static Classes):
- این کلاسها معمولاً شامل متدها و ویژگیهای ایستا هستند که میتوانید مستقیماً از آنها استفاده کنید. به عنوان مثال، برای استفاده از متد Sqrt در کلاس Math:
double result = Math.Sqrt(16);
2- کلاسهای انتزاعی (Abstract Classes):
- ابتدا باید یک کلاس فرزند از کلاس انتزاعی ایجاد کنید و سپس از کلاس فرزند نمونهسازی کنید. به عنوان مثال:
abstract class Animal
{
public abstract void MakeSound();
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
Dog myDog = new Dog();
myDog.MakeSound(); // Output: Woof!
3- کلاسهای دارای سازندههای خصوصی (Private Constructors):
- این کلاسها معمولاً از طریق یک متد ایستا یا یک ویژگی ایستا قابل دسترسی هستند. به عنوان مثال، برای پیادهسازی الگوی Singleton:
public class Singleton
{
private static Singleton instance = null;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
Singleton singletonInstance = Singleton.Instance;
3.1M حجم رسانه بالاست
مشاهده در ایتا
35
فرض می کنیم مشتری سفارش ساخت برنامه حسابداری تحت ویندوز داده و تیم فنی برای پیاده سازی نرم افزار از دانت فریمورک استفاده می کند بعد از تکمیل، تحویل مشتری می دهد بعد از مدتی مشتری با موفق بودن نرم افزار طبق نیاز بازار، نسخه موبایل را درخواست می کند و تیم فنی طراحی نسخه موبایل از زامارین استفاده می کند در اینجا یک مشکلی به وجود میاد کدهای ui برنامه ویندوز با موبایل فرق می کند و نمی تواند کدهای ویندوز را در زامارین استفده کند ولی کدهای بیزینس همونه، یعنی فرایند های برنامه حسابداری در نسخه ویندوز و موبایل یکیه، مشکل تیم فنی اینه که کدهای مربوط به بیزینس که قبلا برای برنامه تحت ویندوز در دات نت فریمورک نوشته است الان قابل استفاده نیست چون کدی که روی یکی از پیاده سازی های دات نت می نویسد نمی تواند روی بقیه پیاده سازی ها اجرا بشود در این مثال هم نمی تواند کدهایی که برای نسخه ویندوز در دات نت فریمورک نوشته است از همون نسخه موبایل در زامارین استفاده کند و مجبور به همه کدها را از اول در زامارین بنویسد
مایکروسافت برای رفع این مشکل دات نت استاندارد را معرفی کرد که یک لایه قرار می گیرد تمام پیاده سازی های دات نت و کدها را در بین این فریم ورک ها به اشتراک می گذارد پس ما اگر برای Class librariy از نوع دانت استاندارد استفاده کنیم می توانیم کدها را بین همه پیاده سازی های دا نت استفاده کنیم و در زمان کد نویسی صرفه جویی کنیم
به این نکته دقت کنیم که دات نت استاندارد یک فریمورک نیست و فقط Class librariey که در کنار پروژه ها استفاده کنیم
فهرست
فصل اول معرفی سی شارپ
1- زبان برنامه نویسی
2- ویژوال استودیو چیست ؟ و راهنمای نصب
3- ساخت اولین پروژه با هوش مصنوعی
4- معرفی کدهای پیشفرض سی شارپ
5- متغیر ها و عملگر ها در سی شارپ