۱۳۸۹/۰۳/۱۶

آرگومان‌هاي نامگذاري شده (named arguments/parameters) در C#4 :


سؤال: آيا شما بدون مراجعه به مستندات شيء FormsAuthenticationTicket مي‌توانيد پاسخ دهيد هر كدام از آرگومان‌هاي ذكر شده در سازنده‌ي اين كلاس چه كاربرد و معنايي دارند؟

var ticket = new FormsAuthenticationTicket
(
1,
principal.Identity.Name,
DateTime.Now,
DateTime.Now.AddMinutes(30),
true,
string.Empty,
FormsAuthentication.FormsCookiePath
);

الان چطور؟!
            //using named parameters of C# 4.0
var ticket = new FormsAuthenticationTicket
(
version: 1,
name: principal.Identity.Name,
issueDate: DateTime.Now,
expiration: DateTime.Now.AddMinutes(30),
isPersistent: true,
userData: string.Empty,
cookiePath: FormsAuthentication.FormsCookiePath
);

گاهي از اوقات ويژگي‌هايي كه به يك زبان برنامه نويسي اضافه مي‌شوند راه و روش برنامه نويسي را ممكن است كاملا تحت تاثير قرار دهند؛ براي مثال استفاده از Generics . اما گاهي از اوقات اين ويژگي‌هاي جديد syntax sugar يا nice to have هستند(!) مانند Named arguments .
Named arguments يا آرگومان‌هاي نامگذاري شده خوانايي كدهاي شما را با بيان اينكه هر آرگومان چه معنايي دارد، افزايش مي‌دهند. براي مثال به نظر شما كدام روش فراخواني متد Copy در ذيل خواناتر است؟
File.Copy("source.txt", "destination.txt", true);
و يا؟
File.Copy("source.txt", "destination.txt", overwrite: true);
هر دو يك كار را انجام مي‌دهند اما درك عملكرد روش اول حتما نياز به بررسي مستندات متد Copy را خواهد داشت.

نكات تكميلي:
متد ساده زير را در نظر بگيريد:
static void Foo(int x, int y) {}
الف) در حالت معمولي و بدون استفاده از named argument ، پارامترهاي يك متد، positional parameters هم ناميده مي‌شوند. به اين معنا كه محل ذكر يك پارامتر مهم است و براي مثال در روش متداول فراخواني ذيل، پارامتر دوم هميشه همان y است و پارامتر اول همواره همان x درنظر گرفته مي‌شود:
Foo(1,2);
اما زمانيكه از named parameters استفاده مي‌كنيد، اين ترتيب ديگر اهميتي نداشته و هر دو فراخواني ذيل مجاز مي‌باشند و به يك معنا هستند:
Foo(x:4, y:2);
Foo(y:2, x:4);
ب) همواره positional parameters بايد پيش از named parameters ذكر شوند. براي مثال فراخواني ذيل مجاز است:
Foo(4, y:2);
اما فراخواني زير مجاز نبوده و برنامه كامپايل نخواهد شد:
Foo(x:4, 2);     // Compile time error