نویسنده : امیر
نظرات : ۰ دیدگاه
بازدید : ۶۳۳ بازدید
تاریخ : ۰۲ آذر ۱۳۹۶

در این جلسه از آموزش برنامه نویسی سی شارپ که کمی طولانی هم است قصد بررسی اپراتورها و کاربرد آنها می پردازیم که بعد از این جلسه شما یکی از مباحث سنگین برنامه نویسی سی شارپ را یاد گرفته و می توانید از آن استفاده کنید.
حتما قبل از بررسی اپراتورها در سی شارپ نوشته ی مطالب قبلی این دوره ی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
بررسی Initializers :
Initializers روشی دیگر برای ساخت شیء و مقدار دهی به field ها و property های (در مورد property بعداً بحث خواهیم کرد) کلاس است. با استفاده از object initializers، دیگر constructor کلاس را به روش معمول صدا نمیزنید بلکه اسم field ها و property ها را مینویسید و مستقیماً به آنها مقدار میدهید. استفادهی اصلی object initializers برای anonymous typeهای ساخته شده توسط LINQ است اما در حالت معمول نیز میتوانند مورد استفاده قرار گیرند.
به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 توسط خط کد زیر تولید شده است:
1 |
Human Man = new Human { Name = "Paul", Age = 28 }; |
بررسی Optional Arguments :
اگر بخواهیم تعداد پارامترهای ورودی دلخواه و بین هیچ تا تعداد پارامتر ورودی تعریف شده باشد.
1 2 3 4 5 6 7 8 9 10 |
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ها اهمیتی ندارد.
به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 |
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 (عملگرهای دوتایی). فرم کلی هرکدام را در زیر میبینید:
1 2 3 4 5 6 7 8 9 10 11 |
// 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 استفاده کنند.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
// 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 بهشکل زیر است:
1 2 3 4 5 |
// General form for overloading a unary operator public static ret-type operator op(param-type operand) { // operations } |
بهعنوان مثال متد زیر، unary minus را overload میکند:
1 2 3 4 5 6 7 |
public static TwoD operator -(TwoD ob) { TwoD result = new TwoD(); result.X = -ob.X; result.Y = -ob.Y; return result; } |
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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) انجام شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
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 در نظر بگیرید.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسه ی بعدی دوره آموزشی سی شارپ باشید.
موفق و پیروز باشید.
دیدگاهتان را بنویسید