از عملگرهای ضمنی و صریح برای تبدیل بین انواع تعریف شده توسط کاربر و بهبود خوانایی کد خود استفاده کنید.
یکی از ویژگیهای کمتر شناخته شده سی شارپ، توانایی ایجاد تبدیلهای ضمنی و صریح از نوع تعریفشده توسط کاربر است، به این معنی که ما از تبدیلهای ضمنی و صریح از یک نوع به نوع دیگر پشتیبانی میکنیم. ما همچنین عملگرهای صریح و ضمنی داریم، به این معنی که برخی از عملگرها نیاز به ریخته گری صریح دارند و برخی از عملگرها نیازی ندارند.
این مقاله در مورد این عملگرهای تبدیل صریح و ضمنی و نحوه کار با آنها در سی شارپ صحبت می کند. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را دنبال کنید تا یک پروژه برنامه کاربردی کنسول NET Core جدید در Visual Studio ایجاد کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود” که در ادامه نشان داده شده است، نام و مکان پروژه جدید را مشخص کنید.
- بعدی را کلیک کنید.
- در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، “NET 7.0 (Standard Term Support)” را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
- روی ایجاد کلیک کنید.
با دنبال کردن این مراحل، یک پروژه برنامه کاربردی کنسول NET Core جدید در Visual Studio 2022 ایجاد میشود. ما از این پروژه برای کار با تبدیلهای نوع در بخشهای بعدی این مقاله استفاده خواهیم کرد.
تبدیل نوع ضمنی و صریح چیست؟
تبدیل نوع ضمنی تبدیلی است که توسط زمان اجرا به صورت خودکار انجام می شود. شما نیازی به پخش کردن به نوع خاصی ندارید. در اینجا یک مثال است که تبدیل ضمنی را نشان می دهد:
int x = 100;
double d = x;
با این حال، توجه داشته باشید که کد زیر کامپایل نخواهد شد.
double d = 100.25;
int x = d;
در اینجا خطایی است که در ویژوال استودیو هنگام کامپایل کردن قطعه کد بالا مشاهده خواهید کرد.
شکل ۱. کامپایلر به شما اجازه نمی دهد که یک دوتایی به یک متغیر عدد صحیح در C# اختصاص دهید.
خطا نشان می دهد که زمان اجرا بدون ارسال نوع صریح، یک double را به int تبدیل نمی کند. این نوع ریختهگری به عنوان ریختهگری نوع صریح شناخته میشود، زیرا برای انجام نوع ریختهگری باید کد واضح بنویسید.
میتوانید قطعه کد غیرقابل کامپایل را با تعیین یک نوع صریح cast از double به int همانطور که در قطعه کد زیر نشان داده شده است، برطرف کنید.
int x = 100;
double d = (int) x;
کد بالا با موفقیت بدون هیچ خطایی کامپایل می شود.
کلاس های مدل و DTO را در C# ایجاد کنید
حالا بیایید بفهمیم که چگونه میتوانیم از تبدیلهای ضمنی و صریح در انواع دادههای تعریفشده توسط کاربر، یعنی کلاسها استفاده کنیم.
دو کلاس زیر را در نظر بگیرید.
public class Author
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class AuthorDto
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
در قطعه کد قبلی، کلاس Author مدل است، یعنی موجودیت Author را نشان می دهد. کلاس AuthorDto نشان دهنده شی انتقال داده کلاس Author است. شی انتقال داده محفظه ای از داده است که برای انتقال داده ها بین لایه های یک برنامه استفاده می شود.
تبدیل مدل به DTO و بالعکس در سی شارپ
دو روش زیر نشان میدهد که چگونه میتوانید یک نمونه Author را به یک نمونه AuthorDto و تبدیل و یک نمونه AuthorDto را به یک نمونه نویسنده تبدیل کنید.
public AuthorDto ConvertAuthorToAuthorDto(Author author)
{
AuthorDto authorDto = new AuthorDto
{
Id = author.Id.ToString(),
FirstName = author.FirstName,
LastName = author.LastName
};
return authorDto;
}
public Author ConvertAuthorDtoToAuthor(AuthorDto authorDto)
{
Author author = new Author
{
Id = Guid.Parse(authorDto.Id),
FirstName = authorDto.FirstName,
LastName = authorDto.LastName
};
return author;
}
اگر نیاز به نوشتن چنین کد تبدیلی برای چندین کلاس در برنامه خود داشته باشید، نه تنها آن را دست و پا گیر خواهید دید، بلکه کد شما خوانایی مناسبی نیز نخواهد داشت. اینجا جایی است که عملگرهای تبدیل ضمنی و صریح وارد می شوند.
از عملگر تبدیل ضمنی در سی شارپ استفاده کنید
یک راه بهتر برای دستیابی به تبدیل مدل-DTO که در بالا نشان داده شده است، استفاده از عملگرهای ضمنی و صریح است. هنگامی که از عملگرهای تبدیل ضمنی یا صریح استفاده می کنید، نیازی به نوشتن روش های دست و پا گیر برای تبدیل یک نمونه از یک نوع به نوع دیگر ندارید. کد بسیار ساده تر است.
قطعه کد زیر نشان می دهد که چگونه می توانید از مزیت عملگر ضمنی برای تبدیل یک نمونه Author به یک نمونه AuthorDto استفاده کنید.
public static implicit operator AuthorDto(Author author)
{
AuthorDto authorDto = new AuthorDto();
authorDto.Id = author.Id.ToString();
authorDto.FirstName = author.FirstName;
authorDto.LastName = author.LastName;
return authorDto;
}
و در اینجا نحوه استفاده از عملگر ضمنی برای تبدیل یک نمونه Author به یک نمونه AuthorDto آمده است:
static void Main(string[] args)
{
Author author = new Author();
author.Id = Guid.NewGuid();
author.FirstName = "Joydip";
author.LastName = "Kanjilal";
AuthorDto authorDto = author;
Console.ReadKey();
}
از عملگر تبدیل صریح در C# استفاده کنید
قطعه کد زیر نشان می دهد که چگونه می توانید از مزیت عملگر صریح برای تبدیل یک نمونه Author به نمونه ای از کلاس AuthorDto استفاده کنید.
public static explicit operator AuthorDto(Author author)
{
AuthorDto authorDto = new AuthorDto();
authorDto.Id = author.Id.ToString();
authorDto.FirstName = author.FirstName;
authorDto.LastName = author.LastName;
return authorDto;
}
در این مورد، همانطور که در قطعه کد ارائه شده در زیر نشان داده شده است، برای تبدیل یک نمونه Author به یک نمونه AuthorDto، به یک Cast واضح نیاز دارید.
static void Main(string[] args)
{
Author author = new Author();
author.Id = Guid.NewGuid();
author.FirstName = "Joydip";
author.LastName = "Kanjilal";
AuthorDto authorDto = (AuthorDto)author;
Console.ReadKey();
}
توجه داشته باشید که نمی توانید هر دو عملگر ضمنی و صریح را در یک کلاس تعریف کنید. اگر یک عملگر ضمنی تعریف کرده باشید، می توانید اشیاء را به صورت ضمنی و صریح تبدیل کنید. با این حال، اگر یک عملگر صریح تعریف کرده باشید، فقط می توانید اشیاء را به طور صریح تبدیل کنید. این توضیح می دهد که چرا نمی توانید هر دو عملگر ضمنی و صریح را در یک کلاس داشته باشید. اگرچه استفاده از ارسالهای ضمنی راحتتر است، اما ارسال صریح وضوح و خوانایی بهتر کد شما را فراهم میکند.
پست های مرتبط
نحوه استفاده از عملگرهای ضمنی و صریح در سی شارپ
نحوه استفاده از عملگرهای ضمنی و صریح در سی شارپ
نحوه استفاده از عملگرهای ضمنی و صریح در سی شارپ