Monday, April 5, 2010

C# 2008 ийн онцлогууд: Далд төрөлтэй дотоод хувьсагч (Implicitly Typed Local Variables)

C# 2008-нд гарсан нэг шинэ зүйл далд төрөлтэй дотоод хувьсагч зарлах боломжтой болсын байна. Энэ скрипт (script) хэлүүдэд ихэвчлэн ашиглагддаг хувьсагч хэрэглэлтйин техникыг авч хэрэгжүүлсэн байна. Энэ хүснэгт-1 болон хүснэгт- 2 дээрх жишээн дээр тулгуурлан тайлбарлъя.

static void DeclareExplicitVars()

{

//Энгийн хувьсагчдын зарлалт;

int myInt = 0;

bool myBool = true;

string myString = "Time, marches on...";

}

Хүснэгт- 1. Энгийн төрөл зарлалттай функц

Хүснэгт-1 функцад бидний мэдэх int, bool, string түлхүүр үгүүдийг ашиглаж хувьсагчийн зарлалтаа хийсэн байна.

static void DeclareImplicitVars()

{

// Далд хувьсагчын зарлалт

// var variableName = initialValue;

var myInt = 0;

var myBool = true;

var myString = "Time, marches on...";

// Print out the underlying type.

Console.WriteLine("myInt is a: {0}", myInt.GetType().Name);

Console.WriteLine("myBool is a: {0}", myBool.GetType().Name);

Console.WriteLine("myString is a: {0}", myString.GetType().Name);

}

Хүснэгт- 2. Далд төрлийг ашигласан функц

Харин хүснэгт-2д var гэсэн шинэ түлхүүр үг гарч ирсэн байна. Энэ тохиолдолд компайлар автоматаар myInt, myBool, myString-д харгалзан System.Int32, System.Boolean, System.String санах ойн хувиарлалт хийдэг.

Одоо массив, ерөнхий төрөл мөн хэрэглэгчийн тодорхойлсон төрөл дээр хэрхэн ашиглахыг хүснэгт-3д харууллаа.

static void DeclareImplicitVars()

{

...

// Зарим далд өгөгдлын төрөлтэй дотоод хувьсагч

var evenNumbers = new int[] { 2, 4, 6, 8 };

var myMinivans = new List();

var myCar = new SportsCar();

Console.WriteLine("evenNumbers is a: {0}", evenNumbers.GetType().Name);

Console.WriteLine("myMinivans is a: {0}", myMinivans.GetType().Name);

Console.WriteLine("myCar is a: {0}", myCar.GetType().Name);

}

Хүснэгт- 3. Далд хувьсагчийг бусад өгөгдлийн төрөлд ашиглах нь

Уг жишээнд Системийн жагсаалт, массив өгөгдлийн төрөл болон хэрэглэгчийн тодорхойлж өгсөн SportsCar төрлийн зарлалт, болон утга оноолтыг харуулсан байна. Зураг-3 DeclareImplicitVars() функцыг ажиллуусан үр дүнг харууллаа.

Зураг-3 DeclareImplicitVars() гаралтын үр дүн


Foreach дэх var төрөлтэй хувьсагч

Далд төрөл нь int массиван var төрлийн хувьсагчид дараалсан давталтанд хэрхэн хандахыг хүснэгт-4д харуулав.

static void VarInForeachLoop()

{

var evenNumbers = new int[] { 2, 4, 6, 8 };

// “var” foreach давталданд ашиглах нь .

foreach (var item in evenNumbers)

{

Console.WriteLine("Item value: {0}", item);

}

}

Хүснэгт- 4. “var” foreach давталтанд ашиглах нь

Мөн давталт дотроо хүснэгтийн төрлийг хатуугаар зааж өгч гүйх боломжтой хүснэгт-4 ийн кодыг ийм байдалд өөрчилснөөр харуулбал(Хүснэгт-5).

static void VarInForeachLoop()

{

var evenNumbers = new int[] { 2, 4, 6, 8 };

// System.Int32 төрлийг хатуугаар заасан байна.

foreach (int item in evenNumbers)

{

Console.WriteLine("Item value: {0}", item);

}

}

Хүснэгт- 5. foreach давталтанд төрөл хатуугаар заах

Далд төрөлтэй хувьсагч дахь хязгаарлагдмал байдал

Бид уг хувьсагчийг method болон propterty-д зөвхөн дотоод хувьсагчын хүрээнд л ашиглаж болно. Мөн var түлхүүр үгийг функцийн буцаах утга, параметр, field –үүдэд хэрэглэвэл алдаатай(Хүснэгт-6).

class ThisWillNeverCompile

{

//field өгөгдөлд ашигласан, алдаа!

private var myInt = 10;

// буцаах утга болон параметерт хэрэглэсэн, алдаа!

public var MyMethod(var x, var y){}

}

Хүснэгт- 6. Алдаатай код

Бусад хориглолт болон байж болох хувилбаруудыг хүснэгт-7д жишээгээр харууллаа.

//Утга олгоогүй, алдаа!

var myData;

//Зарлалтын үед утга олгоогүй, алдаа!

var myInt;

myInt = 0;

//Null утга олгосон, алдаа!

var myObj = null;

//Утга олголгдсоны дараа заалт төрөлтэй болох учир энд ямар нэгэн алдаа үүсэхгүй

var myCar = new SportsCar();

myCar = null;

// Зөв!

var myInt = 0;

var anotherInt = myInt;

string myString = "Wake up!";

var myData = myString;

//буцаах утгын төрөл нь int бөгөөд далд төрөл нь таарч байна, зөв!

static int GetAnInt()

{

var retVal = 9;

return retVal;

}

Хүснэгт- 7. Зарим алдаатай болон зөв бичлэг

Далд төрөлтэй дотоод массив

Хүснэгт-8 жишээгээр далд төрөлтэй массиван хувьсагчийн хэрхэн заралхыг харууллаа.

static void DeclareImplicitArrays()

{

// int[].

var a = new[] { 1, 10, 100, 1000 };

Console.WriteLine("a is a: {0}", a.ToString());

// double[].

var b = new[] { 1, 1.5, 2, 2.5 };

Console.WriteLine("b is a: {0}", b.ToString());

// string[].

var c = new[] { "hello", null, "world" };

Console.WriteLine("c is a: {0}", c.ToString());

// SportsCar[].

var myCars = new[] { new SportsCar(), new SportsCar() };

Console.WriteLine("myCars is a: {0}", myCars.ToString());

Console.WriteLine();

//System.Object төрлийн массивыг үүсгэх боломжгүй. Хувьсагчийн төрөл холилдно, алдаа!

//Компайларын алдаа гарна

var d = new[] { 1, "one", 2, "two", false };

}

Хүснэгт- 8. Далд төрөлтэй массив

Далд төрөлтэй хувьсагчыг LINQ технолгид ашигладаг учир нь query илэрхийлэлийг буцаах утга нь тодорхойгүй байдаг бөгөөд үүнийг далд төрөлтэй хувьсагч ашиглан барьж авдаг.

No comments:

Post a Comment