آموزش سی شارپ – اپراتورها
در این جلسه از آموزش برنامه نویسی سی شارپ که کمی طولانی هم است قصد بررسی اپراتورها و کاربرد آنها میپردازیم. بعد از این جلسه شما یکی از مباحث سنگین برنامه نویسی سی شارپ را یاد گرفته و میتوانید از آن استفاده کنید.
حتما قبل از بررسی اپراتورها در سی شارپ نوشتهی مطالب قبلی این دورهی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
آموزش سی شارپ اپراتورها
بررسی Initializers
Initializers روشی دیگر برای ساخت شیء و مقدار دهی به fieldها و propertyهای (در مورد property بعداً بحث خواهیم کرد) کلاس است. با استفاده از object initializers، دیگر constructor کلاس را به روش معمول صدا نمیزنید. بلکه اسم fieldها و property ها را مینویسید و مستقیماً به آنها مقدار میدهید. استفادهی اصلی object initializers برای anonymous typeهای ساخته شده توسط LINQ است. اما در حالت معمول نیز میتوانند مورد استفاده قرار گیرند.
به مثال زیر توجه کنید:
class Human { public string Name; public int Age; public void Show() { Console.WriteLine(Name + " " + Age); } } // Using : Human Man = new Human { Name = "Paul", Age = 28 }; Man.Show();
نکته اینجاست که از هیچ constructorای استفاده نکردهایم بلکه شیء Man توسط خط کد زیر تولید شده است:
Human Man = new Human { Name = "Paul", Age = 28 };
بررسی Optional Arguments
اگر بخواهیم تعداد پارامترهای ورودی دلخواه و بین هیچ تا تعداد پارامتر ورودی تعریف بشود.
public void OptArg(int a, int b = 2, int c = 3) { Console.WriteLine("This is a, b, c: {0} {1} {2}", a, b, c); } // Using : OptionalArgs ob = new OptionalArgs(); ob.OptArg(5); ob.OptArg(3, 9); ob.OptArg(4, 6, 8);
Named Arguments چیست؟
برای تغییر مکان پارامتر ورودی کافیست نام پارامتری که argument قرار است به آن داده شود. در هنگام ارسال argument مشخص کنید و بعد از اینکار، دیگر ترتیب argumentها اهمیتی ندارد.
به مثال زیر توجه کنید:
static int Div(int firstParam, int secondParam) { return firstParam / secondParam; } // Using : result = Div(10, 5); // Call by use of named arguments. result = Div(firstParam: 10, secondParam: 5); // Order dosn't matter with a named argument. result = Div(secondParam: 5, firstParam: 10);
معرفی namespace
اجازه میدهند به کلاسها و متدهای مختلف و گستردهتری از .NET Framework دسترسی پیدا کنند؛ در واقع، هر برنامه سیشارپ از namespace استفاده میکند. سیشارپ بهطور اتوماتیک، یک global namespace برای برنامه شما تعریف میکند. یک namespace ناحیهای را مشخص میکند که اسامی به کارگرفته شده، در مجموعههای متفاوت جدا در نظر گرفته شوند. به عبارت دیگر، یک نام در یک namespace با نام یکسانی دیگر در namespace دیگری تداخل پیدا نمیکند.
معرفی Operator Overloadingها
سیشارپ به شما اجازه میدهد operatorهایی (عملگر) تعریف کنید که مرتبط به کلاسهایی است که خودتان میسازید. به این پروسه، operator overloading گفته میشود. هنگامیکه یک عملگر overload میشود، معنای واقعی خودش را از دست نمیدهد. بلکه فقط کاربرد آن به یک کلاس افزوده میشود. بنابراین (بهعنوان مثال) overload کردن عملگر + برای افزودن یک شیء به انتهای لیست پیوندی، دلیل نمیشود. عملکرد آن operator برای جمع کردن دو عدد صحیح تغییر کند. مزیت اصلی operator overloading این است که به شما اجازه میدهد بهطور یکپارچه، یک کلاس جدید را در محیط برنامهنویسی خود، ادغام کنید. این ویژگی که به آن type extensibility میگویند.
اصول Operator Overloading
Operator overloading شباهت زیادی با Method overloading دارد. برای overload کردن یک عملگر، از کلمهی کلیدی operator برای تعریف یک operator method استفاده میکنیم. برای یک عمل خاص، مربوط به کلاس خودش، تعریف میشود.
دو حالت از operator method وجود دارد:
- unary operators (عملگرهای تکی).
- binary operators (عملگرهای دوتایی).
فرم کلی هرکدام را در زیر میبینید:
// General form for overloading a unary operator public static ret-type operator op(param-type operand) { // operations } // General form for overloading a binary operator public static ret-type operator op(param-type1 operand1, param-type1 operand2) { // operations }
نکته:
- عملگری که آن را overload میکنید، مثل + یا / ، جایگزین op میشود. ret-type مشخص کنندهی نوع مقداری است که return خواهد شد.
- اگرچه return type میتواند هر نوعی شود اما اغلب از نوع همان کلاسی است که operator در آن overload میشود.
- توجه کنید که operator method ها باید public static شود.
- در unary operator ها، نوع عملوند (operand) باید با نوع کلاسی که operator در آن تعریف میشود، یکسان شود. بنابراین نمیتوانید operatorهای سیشارپ را برای اشیایی که خودتان نساختهاید، تعریف کنید.
- operator parameters نباید از ref و out استفاده کنند.
مثال:
// A two-dimensional coordinate class. class TwoD { private int X, Y; // 2-D coordinates // Constructors public TwoD() { X = 0; Y = 0; } public TwoD(int x, int y) { this.X = x; this.Y = y; } // Overload binary + public static TwoD operator +(TwoD ob1, TwoD ob2) { TwoD result = new TwoD(); result.Y = ob1.Y + ob2.Y; result.X = ob1.X + ob2.X; return result; } // Overload binary - public static TwoD operator -(TwoD ob1, TwoD ob2) { TwoD result = new TwoD(); result.Y = ob1.Y - ob2.Y; result.X = ob1.X - ob2.X; return result; } public void Show() { Console.WriteLine("X: {0} Y: {1}", this.X, this.Y); } } // Using : TwoD a = new TwoD(45, 30); TwoD b = new TwoD(15, 13); TwoD c; Console.Write("Here is a: "); a.Show(); Console.Write("Here is b: "); b.Show(); c = a + b; Console.WriteLine(); Console.WriteLine("After add operator: "); c.Show(); c = a - b; Console.WriteLine(); Console.WriteLine("After subtract operator: "); c.Show();
وقتیکه مختصات اشیاء، درون ()+operator باهم جمع میشوند، حاصل جمع x و y ، عدد صحیح است. درواقع ، عملگر + که برای اشیای TwoD ،overload شده است تاثیری بر عملگر + که روی اعداد صحیح اعمال میشود ندارد. Unary Operatorها مانند Binary Operatorها overload میشوند. با این تفاوت که در Unary Operators تنها یک operand وجود دارد.
فرم کلی Unary Operators بهشکل زیر است:
// General form for overloading a unary operator public static ret-type operator op(param-type operand) { // operations }
بهعنوان مثال متد زیر، unary minus را overload میکند:
public static TwoD operator -(TwoD ob) { TwoD result = new TwoD(); result.X = -ob.X; result.Y = -ob.Y; return result; }
مثال:
class TwoD { private int X, Y; public TwoD() { X = Y = 1; } public TwoD(int a, int b) { X = a; Y = b; } public static TwoD operator -(TwoD ob) { TwoD result = new TwoD(); result.X = -ob.X; result.Y = -ob.Y; return result; } public void Show() { Console.WriteLine("{0}, {1}", X, Y); } } // Using : TwoD ob = new TwoD(1, 1); TwoD result; result = -ob; ob.Show(); result.Show();
شما میتوانید operator methods را هم overload کنید. رایجترین دلیل آن این است که با این کار این امکان را فراهم میکنید تا عملیات بین یک class type (مثل کلاسی که خودتان تعریف کردید). یک built-in type (یک type که در دات نت موجود است، مثل int) انجام شود.
class TwoD { int X, Y; public TwoD() { X = Y = 0; } public TwoD(int a, int b) { X = a; Y = b; } // Overload binary + for TwoD + int. public static TwoD operator +(TwoD op1, int op2) { TwoD result = new TwoD(); result.X = op1.X + op2; result.Y = op1.Y + op2; return result; } // Overload binary + for TwoD + TwoD. public static TwoD operator +(TwoD op1, TwoD op2) { TwoD result = new TwoD(); result.X = op1.X + op2.X; result.Y = op1.Y + op2.Y; return result; } public void Show() { Console.WriteLine(X + ", " + Y); } } // Using : TwoD ob1 = new TwoD(); TwoD ob2 = new TwoD(3, 3); TwoD result; result = ob1 + 2; // TwoD + int ob1.Show(); result.Show(); result += ob2; // TwoD + TwoD ob2.Show(); result.Show(); // Exam ob1 = ob2 + 10; // OK ob1 = 10 + ob2; // Error
به این دلیل که argument عدد صحیح، دومین argument است. برای اینکه هر دو عبارت برای استفاده مجاز شود، باید یک بار دیگر + را overload کنید. اینبار باید اولین پارامتر را int و دومین پارامتر را TwoD در نظر بگیرید.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسهی بعدی دوره آموزشی سی شارپ بمانید.
ارسال پاسخ