Những chủ đề tiến bộ trong C#
Attribute
1 attribute 1 th dùng đ đánh dấu (marker) được ng dụng đến 1
phương thức hay 1 lớp thậm c 1 đi số riêng trong 1 phưong thức ,cung
cấp thông tin thêm vmục đó. dattribute Conditional thể được dùng
để đánh dấu 1 phương thức như là 1 phương thức debug như sau :
[Conditional("DEBUG")]
public void DoSomeDebugStuff()
{
// do something
}
Để áp dụng 1 attribute đến 1 mục ta cung cấp tên ca attribute trong ngoặc
vuông ngay trước định nghĩa mục. các attribute ly vài thông s - nhng
thông số này cung cấp bên trong du ngoặc theo sau tên attribute
cấp độ bản nhất của , ng dụng 1 attribute vào 1 mục thể đơn
giản chỉ là thông tin thêm vmục đó đựợc bỏ trong assembly đuợc biên dịch
dùng cho mục đích hướng dẫn thêm. 1 số attribute được định nghĩa trong các
lớp sở đuợc nhận ra bởi trình biên dịch C#.mà từ đó trình biên dch có thể
gây ra những tác động trên mã . dtrên trình biên dịch sbiên dịch mã
của mục Conditional chỉ nếu biểu tượng DEBUG đã được định nghĩa trước.
Trong phần này ta s xem xét 3 attribute sau :
- Conditional : th đánh dấu bất kì phương thức với attribute
Conditional . sngăn ngừa trình biên dịch từ việc biên dịch phương thức đó
hay bất kì u lnh mà tham kho đến nếu tên biu tượng không được
định nghĩa. điều này có thể được dùng cho điều kiện biên dịch .
- Dllimport - đôi khi ta cần truy nhập đến c Window API cơ bản hoặc
các m kiểu cũ khác được thực thi trong các window DLLs.attribute
Dllimport dùng cho mục đích y . được dùng đánh dấu 1 phương thức
được định nfghĩa trong Dll bên ngoài.
- Obsolete - attribute này được dùng đ đánh dấu 1 phương thức được
xem như obsolete ( không dùng nữa) . tuỳ thuộc vào việc thiết lập trên
attribute này , trình biên dch ssinh ra 1 cảnh báo hay lỗi nếu gặp bất kì
mã nào cgắng dùng phương thức này.
Ta xem xét các attribute này thông qua dAttributes . trình bày 1 message
box dùng hàm Window API ,MessageBox , cũng trình y 2 tng điệp
lỗi. 1 trong những thông điệp y được gi trung gian qua 1 phương thức
obsolete
#define DEBUG // comment out this line if doing a release build
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace Wrox.ProCSharp.AdvancedCSharp
{
class MainEntryPoint
{
[DllImport("User32.dll")]
public static extern int MessageBox(int hParent, string Message,
string Caption, int Type);
static void Main()
{
DisplayRunningMessage();
DisplayDebugMessage();
MessageBox(0, "Hello", "Message", 0);
}
[Conditional("DEBUG")]
private static void DisplayRunningMessage()
{
Console.WriteLine("Starting Main routine. Current time is " +
DateTime.Now);
}
[Conditional("DEBUG")]
[Obsolete()]
private static void DisplayDebugMessage()
{
Console.WriteLine("Starting Main routine");
}
}
}
Đầu tiên ta chỉ định một số namespace
- DllImport nằm trong namespace System.Runtime.InteropServices
- Conditional nm trong namespace System.Diagnostics .
Bên trong phương thức ta định nghĩa phương thức mà ta gi từ dll bên ngoài
.hàm API MessageBox() đuợc định nghĩa trong User32.dll, vì thế ta truyền
tên tập tin vào attribute DllImport . ta khai báo hàm giống như trong C.
Tiếp theo trong phương thức DisplayDebugMessage() , ta chỉ muốn phương
thức này chy nếu ta đang làm 1 y dng lỗi, vì thế ta đánh dấu như
là conditional tn biểu tượng DEBUG .ta cũng xem phương thức này là 1
obsoblete , bi vì ta đã viết một phiên bn tốt hơn,
DisplayRunningMessage(), trình y thêm thời gian và ngày tháng.ta
không khuyến khích mọi người dùng DisplayDebugMessage() tm nữa, vì
thế ta đánh dấu với attribute Obsolete để trình biên dịch strình y 1
cảnh báo nếu phương thức này được dùng. 1 vài kiu overload của hàm
này :
[Obsolete("The DisplayDebugMessage is obsolete. Use " +
"DisplayRunningMessage instead.")]