درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من

    تا 75 درصد تخفیف ویژه شب یلدا بر روی کلیه محصولات وب سایت توسینسو فقط تا 30 آذر

    مانده تا پایان تخفیف ها

    تخفیف های وب سایت
    همه تخفیف ها

    عضویت در

    کانال تلگرام

    توسینسو

    اطلاعات مطلب
      مدرس/نویسنده
      حسین احمدی
      امتیاز: 212242
      رتبه:3
      342
      253
      403
      2719
      حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر
      دوره های مرتبط
      دوره های توسینسو دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 27 قسط خریداری کنید
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      مدرس: ایمان جوادی
      این دوره را در 13 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 17 قسط خریداری کنید
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 78 قسط خریداری کنید
      دوره آموزشی طراحی رابط کاربری با JavaFX
      دوره آموزشی طراحی رابط کاربری با JavaFX
      مدرس: حسام رسولیان
      این دوره را در 13 قسط خریداری کنید
      دوره متوسطه برنامه نویسی به زبان جاوا به زبان ساده
      دوره متوسطه برنامه نویسی به زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 18 قسط خریداری کنید
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      مدرس: مهدی عادلی فر
      این دوره را در 2 قسط خریداری کنید
      دوره آموزشی ساخت ربات تلگرام
      دوره آموزشی ساخت ربات تلگرام
      مدرس: کاظم تقندیکی
      این دوره را در 8 قسط خریداری کنید
      دوره آموزشی Exploit نویسی به زبان Perl
      دوره آموزشی Exploit نویسی به زبان Perl
      مدرس: ایمان جوادی
      این دوره را در 7 قسط خریداری کنید
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      مدرس: کاظم تقندیکی
      این دوره را در 20 قسط خریداری کنید
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 17 قسط خریداری کنید
      دوره آموزشی برنامه نویسی مقدماتی پایتون به زبان ساده
      دوره آموزشی برنامه نویسی مقدماتی پایتون به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 23 قسط خریداری کنید
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      مدرس: کاظم تقندیکی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      مدرس: امیر حسین فضلیخانی
      این دوره را در 12 قسط خریداری کنید

      آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و پنجم :: آشنایی با operator overloading و تعریف cast ها

      تاریخ 35 ماه قبل
      نظرات 2
      بازدیدها 1762
      سلام به همه ITPRO ای های عزیز و علاقه مندان مبحث شیرین برنامه نویسی، در خدمت شما هستم با قسمت بیست و پنجم از سری آموزشی برنامه نویسی به زبان سی شارپ. در این قسمت از آموزش با مبحث Operator Overloading و شیوه تعریف کردن Cast های دلخواه آشنا می شویم. ابتدا بهتره با مفهوم Operator Overloading آشنا شده و بعد به سراغ مثال های عملی بریم. Operator Overloading به معنی تعریف کردن نحوه عملکرد یک Operator بر روی یک شئ می باشد. برای مثال، عملگر های جمع، تفریق و ... را در نظر بگیرید، زمانی که ما عملگر جمع را بر روی دو متغیر از نوع int اعمال می کنیم، این عملگر باعث محاسبه حاصل جمع دو عدد می شود، یعنی حال جمع دو عدد را برای ما بر میگرداند:

      int n1 = 12;
      int n2 = 20;
      int result = n1 + n2;
      

      اما فرض کنید کلاسی به صورت زیر تعریف کردیم:

      public class ValueHolder
      {
          public ValueHolder(int value)
          {
              Value = value;
          }
      
          public int Value { get; set; }
      }
      

      کلاس بالا یک عدد داخل خودش نگهداری می کند:

      var holder1 = new ValueHolder(12);
      var holder2 = new ValueHolder(20);
      

      حال، اگر بخواهیم حاصل جمع دو عدد داده شده را حساب کنیم، باید به صورت زیر عمل کنیم:

      var result = holder1.Value + holder2.Value;
      

      اما در صورتی که کد بالا را به صورت زیر بنویسیم با پیغام خطا مواجه می شویم:

      var result = hodler1 + holder2;
      

      دلیل وقوع خطا، عدم تعریف شدن عملگر + برای کلاس ValueHolder است. برای رفع این مشکل می بایست از قابلیت Operator Overloading استفاده کنیم. برای کلاس ValueHolder عملگر جمع را به صورت زیر می توانیم تعریف کنیم:

      public class ValueHolder
      {
          public ValueHolder(int value)
          {
              Value = value;
          }
      
          public int Value { get; set; }
      
          public static ValueHolder operator +(ValueHolder holder1, ValueHolder holder2)
          {
              return new ValueHolder(holder1.Value + holder2.Value);
          }
      }
      

      در کد بالا، متدی تعریف کردیم از نوع static که نوع بازگشتی آن از نوع کلاس ValueHolder می باشد، اما نکته اصلی یکی نوشتن کلمه کلیدی operator بعد از نوع بازگشتی و بعدی قسمت نام متد است، در مثال بالا، به جای نوشتن نام متد، از کلمه کلیدی operator و سپس عملگری که قصد تعریف آن را داریم استفاده شده است. در قسمت پارامترهای متد، ما دو پارامتر به عنوان ورودی دریافت می کنیم که برای پارامتر اولی، مقدار سمت چپ عملگر و پارامتر دوم قسمت سمت راست عملگر قرار می گیرد. در بدنه متد نیز، شئ جدیدی از نوع ValueHolder ایجاد شده و به عنوان مقدار پارامتر Constructor، حاصل جمع مقادیر Value برای دو پارامتر ورودی دریافت می شود. با تغییر کلاس ValueHolder به صورت بالا، مشکلی در اجرای عملگر + به صورت مستقیم برای اشیاء تعریف شده از نوع ValueHolder وجود نخواهد داشت. در ادامه عملگر تفریق، ضرب و تقسیم را نیز تعریف می کنیم:

      public class ValueHolder
      {
          public ValueHolder(int value)
          {
              Value = value;
          }
      
          public int Value { get; set; }
      
          public static ValueHolder operator +(ValueHolder holder1, ValueHolder holder2)
          {
              return new ValueHolder(holder1.Value + holder2.Value);
          }
      
          public static ValueHolder operator -(ValueHolder holder1, ValueHolder holder2)
          {
              return new ValueHolder(holder1.Value - holder2.Value);
          }
      
          public static ValueHolder operator *(ValueHolder holder1, ValueHolder holder2)
          {
              return new ValueHolder(holder1.Value * holder2.Value);
          }
      
          public static ValueHolder operator /(ValueHolder holder1, ValueHolder holder2)
          {
              return new ValueHolder(holder1.Value / holder2.Value);
          }
      }
      

      عملگرهایی که تا اینجا تعریف کردیم، عملگرهای Binary بودند و به همین دلیل دو پارامتر برای ورودی دریافت می کردند، در ادامه دو عملگر ++ و -- رو هم تعریف میکنیم، اما تفاوتی که این دو عملگر دارند، این عملگرها Unary هستند و به همین دلیل یک پارامتر به عنوان ورودی میگیرند، در ادامه تنها کد مربوط به تعریف این عملگرها آمده است:

      public static ValueHolder operator ++(ValueHolder holder)
      {
          return new ValueHolder(holder.Value++);
      }
      
      public static ValueHolder operator --(ValueHolder holder)
      {
          return new ValueHolder(holder.Value++);
      }
      

      در زبان سی شارپ می توانیم عملگر های مقایسه ای را نیز تعریف کنیم. برای مثال کد زیر را در نظر بگیرید:

      var holder1 = new ValueHolder(10);
      var holder2 = new ValueHolder(12);
      if(holder1 > holder2)
      {
      }
      else
      {
      }
      

      با اجرای کد بالا، باز هم پیغام خطا دریافت می کنیم، زیرا هیچ عملگر مقایسه ای برای کلاس ValueHolder تعریف نشده، عملگر مربوطه را به صورت زیر تعریف می کنیم:

      public static bool operator <(ValueHolder holder1, ValueHolder holder2)
      {
          return holder1.Value < holder2.Value;
      }
      

      اما به یک نکته باید توجه کنید، زمانی که عملگر های مقایسه ای را تعریف می کنید، می بایست عملگر مخالف آن نیز تعریف شود، برای مثال، برای عملگر > باید عملگر < را نیز تعریف کنیم، در غیر اینصورت با پیغام خطا مواجه می شویم:

      public static bool operator <(ValueHolder holder1, ValueHolder holder2)
      {
          return holder1.Value < holder2.Value;
      }
      
      public static bool operator >(ValueHolder holder1, ValueHolder holder2)
      {
          return holder1.Value > holder2.Value;
      }
      

      عملگر مساوی و مخالف نیز به صورت زیر تعریف می شوند:

      public static bool operator ==(ValueHolder holder1, ValueHolder holder2)
      {
          return holder1.Value == holder2.Value;
      }
      
      public static bool operator !=(ValueHolder holder1, ValueHolder holder2)
      {
          return holder1.Value != holder2.Value;
      }
      


      تعریف Cast های دلخواه


      یکی از قابلیت های زبان سی شارپ، قابلیت تعریف مجدد Cast ها یا Cast Overloading می باشد. در قسمت قبل در مورد انواع Cast ها گفتیم که بر دو نوع implicit و explicit می باشند. در زبان سی شارپ، می توانیم هر دو نوع این cast را تعریف کنیم. برای مثال، کد زیر را نظر بگیرید:

      var holder = new ValueHolder(12);
      
      int holderValue = holder;
      

      در کد بالا، قصد داریم شئ ای از نوع ValueHolder را به صورت مستقیم داخل متغیری از نوع int قرار دهیم که این کد نیز پیغام خطا تولید می کند، به دلیل اینکه در کد بالا، عملیات تبدیل به صورت implicit انجام می شود، می بایست عملیات تبدیل از نوع ValueHolder به نوع int را به صورت implicit داخل کلاس ValueHolder تعریف کنیم:

      public static implicit operator int(ValueHolder holder)
      {
          return holder.Value;
      }
      

      همانطور که در کد بالا مشاهده می کنید، ابتدا باید یک متد static تعریف شود، اما بعد از کلمه static باید نوع تبدیلی که قصد داریم تعریف کنیم را مشخص کنیم که در کد بالا، تبدیل تعریف شده از نوع implicit می باشد. در قسمت نام متد، نوعی که قصد داریم تبدیل به آن انجام شود را می نویسیم و به عنوان پارامتر ورودی، نوعی که قصد تبدیل از آن را داریم، یعنی در کد بالا عملیات Cast برای تبدیل implicit از نوع ValueHolder به نوع int را تعریف کردیم. در ادامه کد زیر را در نظر بگیرید:

      ValueHolder holder = 12;
      

      در کد بالا، عملیات تبدیل برعکس مثال قبلی است، یعنی عملیات تبدیل از نوع int به نوع ValueHolder انجام میشه که برای اینکار، به صورت زیر می توان عملیات تبدیل را تعریف کرد:

      public static implicit operator ValueHolder(int value)
      {
          return new ValueHolder(value);
      }
      

      علاوه بر تعریف cast به صورت implicit می توان، تبدیل ها را به صورت explicit نیز تعریف کرد. کلاس زیر را در نظر بگیرید:

      public class ValueHolder2
      {
          public ValueHolder2(int value)
          {
              Value = value;
          }
      
          public int Value { get; set; }
      }
      

      کلاس ValueHolder2 مانند کلاس ValueHolder تعریف شده و برای مثال می خواهیم از آن استفاده کنیم. در ادامه کد زیر عملیات تبدیل از ValueHolder2 به ValueHolder به صورت explicit انجام می شود:

      ValueHolder2 holder2 = new ValueHolder2(12);
      var holder = (ValueHolder) holder2;
      

      برای اینکه در کد بالا، پیغام خطا دریافت نکنیم، باید عملیات تبدیل explicit از نوع ValueHolder2 به ValueHolder را در کلاس ValueHolder به صورت زیر تعریف کنیم:

      public static explicit operator ValueHolder(ValueHolder2 holder2)
      {
          return new ValueHolder(holder2.Value);
      }
      

      تنها تفاوتی که وجود دارد، به جای کلمه کلیدی implicit در تعریف متد، از کلمه کلیدی explicit استفاده شده است. در این بخش با مفاهیم operator overloading و تعریف cast ها به دو صورت implicit و explicit آشنا شدیم.در قسمت بعدی سری آموزشی، با مفهوم boxing و unboxing در زمان تبدیل کردن نوع ها آشنا خواهیم شد. ITPRO باشید

      نویسنده : حسین احمدی
      منبع : جزیره برنامه نویسی وب سایت توسینسو
      هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
      برچسب ها
      ردیفعنوان
      1دوره آموزشی .NET Framework و زبان برنامه نویسی سی شارپ - مقدمه
      2آموزش سی شارپ - قسمت اول :: معرفی و بررسی ابزارهای مورد نیاز دوره
      3آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش اول)
      4آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش دوم)
      5آموزش زبان سی شارپ - قسمت سوم :: آشنایی اولیه با محیط Visual Studio و نوشتن اولین برنامه
      6آموزش زبان سی شارپ - قسمت چهارم :: آشنایی با ساختار برنامه ها و کامپایلر زبان سی شارپ
      7آموزش زبان سی شارپ - قسمت پنجم :: آشنایی با دستورات کنسول و متغیرها
      8آموزش زبان سی شارپ - قسمت ششم :: نوع های داده اولیه
      9آموزش زبان سی شارپ - قسمت هفتم :: آشنایی با عملگرهای زبان سی شارپ
      10آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش اول)
      11آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش دوم)
      12آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش سوم)
      13آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش چهارم)
      14آموزش زبان سی شارپ - قسمت نهم :: آشنایی با آرایه ها و دستور foreach
      15آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش اول)
      16آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش دوم)
      17آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت یازدهم :: مقدمه ای بر برنامه نویسی شئ گرا
      18آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت دوازدهم :: آشنایی با کلاس، اشیاء و فضاهای نام
      19آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت سیزدهم :: آشنایی با فیلدها و رفتارها
      20آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت چهاردهم :: آشنایی با Property ها
      21آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت پانزدهم :: آشنایی با سازنده ها و روش های ایجاد اشیاء
      22آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت شانزدهم :: وراثت یا Inheritance
      23آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هفدهم :: آشنایی با مفهوم Polymorphism
      24آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هجدهم:: کلاس های abstract و sealed
      25آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت نوزدهم :: سازنده ها در وراثت، کلمه کلیدی protected و فیلدهای readonly
      26آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیستم :: کلاس های static و partial و Extension Method ها
      27آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و یکم :: Reference Types و Value Types
      28آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و دوم :: آشنایی با کاربرد interface ها
      29آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و سوم :: آشنایی با مفاهیم Inversion of Control و Dependency Injection
      30آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و چهارم :: آشنایی با مفهوم Type Casting و انواع Cast ها
      31آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و پنجم :: آشنایی با operator overloading و تعریف cast ها
      32آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و ششم :: مفاهیم boxing و unboxing
      33آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هفتم :: قابلیت Generics
      34آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هشتم :: نکات تکمیلی Generic ها، کلاس List و کلاس Dictionary
      35آموزش زبان سی شارپ -قسمت بیست و نهم (پایانی): استثناء ها (Exceptions) و مدیریت خطاها در سی شارپ
      دورهمجموعه کل دوره
      مطالب مرتبط

      در حال دریافت اطلاعات

      نظرات
      • سلام. با تشکر از مطالب مفیدتون. به نظر میرسه در دو قطعه کد زیر علامت هارو اشتباه نوشتید. علامت بزرگتر و نامساوی. فکر کنم به صورت زیر اصلاح میشن.
        public static bool operator >(ValueHolder holder1, ValueHolder holder2)
        {
            return holder1.Value > holder2.Value;
        }
        

        public static bool operator !=(ValueHolder holder1, ValueHolder holder2)
        {
            return holder1.Value != holder2.Value;
        }
        


      • ممنون از تذکرتون، اصلاح شد.

      برای ارسال نظر ابتدا به سایت وارد شوید