Tham đối đặt tên (Named argument)
C# 4.0 giới thiệu tham đối đặt tên (named argument) cho phép bạn không phải nhớ thứ tự tham đối trong danh sách tham đối thực sự của lời gọi phương thức. Các tham đối thực sự truyền vào phương thức có thể chỉ rõ bởi tên của tham đối hình thức. Tham đối đặt tên cũng làm cho chương trình dễ đọc hơn bởi vì nó chỉ rõ ý nghĩa của tham đối thực sự. Tham đối đặt tên có thể sử dụng cho phương thức, chỉ mục, tham chiếu phương thức.
Ví dụ:Phương thức tính diện tích hình chữ nhật
class HCN
{
static int DienTich(int rong, int dai)
{
return dai * rong;
}
}
class Test
{
//Lời gọi phương thức
HCN.DienTich(2, 4);
//Nếu không nhớ trật tự các tham đối nhưng nhớ tên tham đối hình thức
//C# 4.0 cho phép gọi phương thức
HCN.DienTich(dai: 4, rong: 2);
//Một tham đối đặt tên có thể theo sau một tham đối không đặt tên
HCN.DienTich(2, dai: 4);
//Nhưng tham đối không đặt tên không thể theo sau tham đối đặt tên
//HCN.DienTich(dai: 4, 2);
}
Tham đối tùy chọn (Optional argument)
C# 4.0 cho phép phương thức, chỉ mục hay tham chiếu phương thức có thể chỉ rõ các tham đối là bắt buộc hay tùy chọn. Bất kỳ lời gọi phương thức phải truyền các tham đối bắt buộc nhưng có thể bỏ qua các tham đối tùy chọn.
Mỗi tham đối tùy chọn có một giá trị mặc định, nếu bỏ qua tham đối tùy chọn, tham đối sẽ có giá trị mặc định. Một giá trị mặc định phải là biểu thức hằng hay kiểu giá trị. Các tham đối tùy chọn được định nghĩa cuối của danh sách tham đối, sau các tham đối bắt buộc. Nếu lời gọi phương thức truyền tham đối cho bất kỳ tham đối tùy chọn, phải truyền tham đối cho bất kỳ tham đối tùy chọn đứng trước trong danh sách tham đối.
Ví dụ: Phương thức đối tượng MyMethod định nghĩa một tham đối bắt buộc và hai tham đối tùy chọn.
class MyClass
{
public void MyMethod(int r, string o1 = "default string", int o2 = 10)
{
Console.WriteLine("{0}: {1} và {2}.", r, o1, o2);
}
static void Main(string[] args)
{
MyClass obj = new MyClass();
obj.MyMethod(1, "One", 1);
obj.MyMethod(2, "Two");
obj.MyMethod(3);
//Lỗi biên dịch do truyền tham đối tùy chọn thứ ba
//nhưng không truyền tham đối tùy chọn thứ hai
//obj.MyMethod(3, ,4);
//obj.MyMethod(3, 4);
//Nhưng nếu bạn biết tên tham đối thứ ba, có thể sử dụng tham đối đặt tên
obj.MyMethod(3, o2: 4);
//Biên dịch lỗi do không truyền tham đối yêu cầu thứ nhất
//obj.MyMethod("One", 1);
//obj.MyMethod();
}
}
Cải tiến hơn giao diện thành phần COM (More COM interface)
Các tham đối đặt tên và tùy chọn cùng với các cải tiến khác của C# 3.0, 4.0 đã cải tiến đáng kể tương tác với giao diện thành phần COM.
Chẳng hạn, phương thức AutoFormat trong dịch vụExcel Interop có 7 tham đối, tất cả đều là tùy chọn. Trong C# 3.0 và các phiên bản trước, các tham đối của phương thức này đều là tham đối bắt buộc.
var excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Workbooks.Add();
excelApp.Visible = true;
var myFormat =
Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1;
excelApp.get_Range("A1", "B4").AutoFormat(myFormat, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Tuy nhiên, với C# 4.0, bạn có thể đơn giản lời gọi phương thức AutoFormat bằng cách sử dụng tham đối đặt tên và tùy chọn. Tham đối đặt tên và tùy chọn cho phép bạn bỏ qua tham đối truyền vào phương thức nếu không muốn thay đổi giá trị mặc định.
excelApp.Range["A1", "B4"].AutoFormat(myFormat);
Phương thức mở rộng (Extension method)
C# 3.0 cung cấp khả năng định nghĩa phương thức mở rộng (extension method) cho một kiểu tồn tại, mà không phải tạo kiểu kế thừa hay chỉnh sửa kiểu gốc, tái biên dịch.
Phương thức mở rộng phải là phương thức tĩnh (static method), nhưng nó được gọi như một phương thức đối tượng. Kiểu dữ liệu của tham đối đầu tiên của phương thức là kiểu lớp cần bổ sung phương thức. Phương thức mở rộng phải đặt trong lớp tĩnh, không lồng nhau (non-nested, non-generic static class). Từ khóa this phải đặt trước tham đối đầu tiên.
Ví dụ:Bổ sung phương thức đếm số từ trong một chuỗi cho kiểu string
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
using ExtensionMethods;
namespace ConsoleApplication1
{
public class Test
{
static void Main(string[] args)
{
string s = "Hello Extension Methods";
int i = s.WordCount();
Console.WriteLine(i);
}
}
}
» Tin mới nhất:
» Các tin khác: