Jaunais vilnis - Labās ziņas parametros
Aplūkojot sīkāk jaunās valodas versijas iespējas uzdūros ļoti labai ziņai par metodes parametriem. Heljsberga kungs šo programmēšanas valodas jauno iespēju nosauca par nemitīgu lietotāju jeb patērētāju spiediena rezultātu :)
Tātad visu pēc kārtas. Notiekti ka esiet rakstījuši bāzes metodi, piemēram, ar 3 parametriem:
static void MethodWithParameters(Guid id, string name, int type)
{
Console.WriteLine(string.Format("id={0}, name={1}, type={2}", id, name, type));
}
un attiecīgi savas metodes patērētājiem piedāvājuši dažādus saīsinošos ceļus, lai izmantotu šo metodi:
static void MethodWithParameters(Guid id)
{
MethodWithParameters(id, null, 1);
}
static void MethodWithParameters(Guid id, string name)
{
MethodWithParameters(id, name, 1);
}
Šoreiz C# 4.0 versijā ir labi jaunumi - neobligātie parametri!
Metode ar neobligātajiem parametriem jaunajā valodas versijā izskatās šādi:
static void MethodWithOptionalParameters(Guid id,
string name = null,
int type = 1)
{
Console.WriteLine(string.Format("id={0}, name={1}, type={2}", id, name, type));
}
Vienkārši jau metodes definēšanas laikā nosaka paramtru vērtības (gluži kā SQL).
Otra pozitīvais jaunums ir, ka līdz ar neobligātajiem parametriem, nāk klāt arī named parameters jeb parametru vērtību nodošana mainīgā secībā. Piemēram, neobligāto parametru vērtību norādīšanai nav svarīga secībā, kādā tie tiek norādīti metodes izsaukumā:
static void Main(string[] args)
{
MethodWithOptionalParameters(Guid.Empty);
MethodWithOptionalParameters(Guid.NewGuid(), type: 2);
MethodWithOptionalParameters(Guid.Empty, type: 2, name: "This is a name");
}
Nododamā parametra vērtība tiek atzīmēta ar parametra nosaukumu, kam seko kols (":") un parametra vērtība.
Runājot, ka šim visam nav nekāda run-time overkilla un attiecīgās metodes izsaukums tiek noteiks jau kopilācijas laikā. Lai par to pārliecinātos, aplūkošim šīs Main metodes kompilēto versiju ar .Net Reflector rīka palīdzību:
private static void Main(string[] args)
{
MethodWithOptionalParameters(Guid.Empty, null, 1);
int CS$0$0000 = 2;
MethodWithOptionalParameters(Guid.NewGuid(), null, CS$0$0000);
CS$0$0000 = 2;
string CS$0$0001 = "This is a name";
MethodWithOptionalParameters(Guid.Empty, CS$0$0001, CS$0$0000);
}
Kā redzams, tad parametri vērtības tiek noteiktas jau kompilācijas laikā.
Šīs ir diezgan labas ziņas, manuprāt :)
Jāpiemin gan, ka dažās funkcionālajās programmēšanas valodās vārdā neminot, šī iespēja jau bija paredzēja manuprāt pirmajās versijās :))
CL-USER 1 > (defun keyword-example (a b c &key d (e 22)) (list a b c d e))
KEYWORD-EXAMPLE
CL-USER 2 > (keyword-example 1 2 3 :d 4)
(1 2 3 4 22)
CL-USER 3 > (keyword-example 1 2 3)
(1 2 3 NIL 22)
CL-USER 4 > (keyword-example 1 2 3 :e 4)
(1 2 3 NIL 4)
Cerams, ka noderēs!
____________________________________