PDA

View Full Version : Biến cục bộ được định nghĩa hoàn toàn trong .NET v3.5



nhc1987
05-02-2008, 01:41 PM
Biến cục bộ được định nghĩa hoàn toàn (Implicitly Typed Local Variables) là 1 trong những tính năng mới mà .NET v5 hỗ trợ (thật ra nó đa có từ .NET v0). Như chúng ta đã biết, biến cục bộ là biến tồn tại trong lòng 1 phương thức của 1 class nào đó. Ví dụ:



class Program
{
static void Main(string[] args)
{
int myInt = 3;
bool myBool = true;
}
}


C# 2008 cung cấp 1 từ khóa mới – var, mà bạn có thể khởi gán 1 biến mà không cần biết trước kiểu dữ liệu và compiler sẽ tự động chuyển đổi kiểu dùm bạn. Ví dụ trên sẽ được biến đổi với việc sử dụng từ khóa – var:



class Program
{
static void Main(string[] args)
{
var myInt = 3;
var myBool = true;
var myString = "cau lac bo VB";
}
}


Trong trường hợp này, compiler sẽ đủ thông minh để “ép kiểu” sang các kiểu dữ liệu .NET tương ứng : System.Int32, System.Boolean và System.String.



var myInt = 3;
var myBool = true;
var myString = "cau lac bo VB";
Console.WriteLine("myInt : {0}", myInt);
Console.WriteLine("myBoolean : {0}", myBool);
Console.WriteLine("myString : {0}", myString);


Kết quả:



myInt : 3
myBoolean : True
myString : cau lac bo VB


Tất nhiên, bạn cũng có thể dùng var cho mảng. Ví dụ:




class Program
{
static void Main(string[] args)
{
var aInt = new int[] { 1, 2, 3, 4, 5, 6 };
foreach (var item in aInt)
{
Console.WriteLine(item.ToString());
}
//hoặc bạn có thể gõ:
//foreach (int item in aInt)
//{
// Console.WriteLine(item.ToString());
//}
}
}


Những điều cần lưu ý:
-Không thể dùng kiểu var cho thuộc tính của class.
-Không thể dùng var làm kiểu giá trị trả về của 1 phương thức:




class SinhVien
{
//lỗi!!!
private var tenHS = "NEVERLAND";
//lỗi!!1
public var LayTenHS()
{
return tenHS;
}
}


-Phải khởi gán 1 biến kiểu var ngay khi khai báo nó.



static void Main(string[] args)
{
//lỗi!! Do chưa khởi gán
var myInt;
//sửa: var myInt = 5;
}


Và phải khởi gán trên cùng 1 dòng:




static void Main(string[] args)
{
//Lỗi! Khởi gán trên dòng khác
var myInt;
myInt = 5;
//sửa:var myInt = 5
}


Tuy nhiên, bạn được phép khởi gán 1 biến var với giá trị null:




class Program
{
static void Main(string[] args)
{
//Được phép
var p = new Program();
p = null;
}
}


Bạn có thể trả lại 1 biến kiểu var trong lòng 1 phương thức:




public int ReturnVal()
{
var myInt = 9;
return myInt;
}



Không thể dựa dẫm vào sự thông minh của Compiler, ví dụ:




static void Main(string[] args)
{
var myString = "I'm Neverland";
myString = "This is fine!";
myString = myString.ToUpper();
//sẽ bị lỗi ở dòng dưới
myString = 9;
}


Nãy giờ, mình chắc chắn là các bạn cảm thấy cái biến var này nó chẳng có 1 ích lợi gì cả. Đúng, với mấy ví dụ mình cho thì không thể làm nổi bật tính năng của nó. Nhưng nếu bạn bước vào sân chơi LINQ của .NET v5 thì bạn sẽ thấy sức mạnh của var. Bây giờ, mình cho các bạn 1 ví dụ về LINQ:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };
var subset = from i in numbers where i < 10 select i;
Console.Write("Cac gia tri cua Subset:");
foreach (var i in subset)
{
Console.Write("{0}\t", i);
}
Console.WriteLine();
//đố bạn biết subset sẽ là gì???
Console.WriteLine("Subset la {0}", subset.GetType().ToString());
Console.WriteLine("Subset duoc dinh nghia trong: {0}", subset.GetType().Namespace);
}
}
}


Kết quả:



Cac gia tri cua Subset:1 2 3 8
Subset la System.Linq.Enumerable+<WhereIterator>d__0`1[System.Int32]
Subset duoc dinh nghia trong: System.Linq


Tác giả: neverland