• HÃY CÙNG TẠO & THẢO LUẬN CÁC CHỦ ĐỀ KIẾN THỨC [Vn Kiến Thức] - Định hướng VnKienthuc.com
    -
    Mọi kiến thức & Thông tin trên VnKienthuc chỉ mang tính chất tham khảo, Diễn đàn không chịu bất kỳ trách nhiệm liên quan
    - VnKienthuc tạm khóa đăng ký tài khoản tự động để hạn chế SEO bẩn, SPAM, quảng cáo. Chưa đăng ký, KHÁCH vẫn có thể đọc và bình luận.

Chia Sẻ Tìm hiểu về Attribute trong C#

uocmo_kchodoi

Moderator
Xu
0
Attribute là một cơ chế được dùng để định nghĩa và khai báo các thông tin cần thiết, nhằm bổ sung và hỗ trợ khá nhiều chức năng liên quan đến việc soạn thảo, debug, cũng như biên dịch các chương trình.

Một attribute trong C#, là một thẻ tường thuật, được sử dụng để truyền thông tin tới runtime về các hành vi của các phần tử đa dạng như các lớp, phương thức, cấu trúc, enum, assembly, … trong chương trình của bạn. Bạn có thể thêm thông tin tường thuật tới một chương trình bởi việc sử dụng một Attribute. Một thẻ tường thuật được miêu tả bởi các dấu ngoặc móc vuông ([]) được đặt bên trên phần tử mà nó được sử dụng cho. Nhiều attribute có thể được sử dụng trong cùng một cặp ngoặc vuông này và được ngăn cách nhau bởi dấu phẩy “,”.

Các Attribute được sử dụng để thêm metadata, ví dụ như chỉ lệnh biên dịch và thông tin khác như comment, miêu tả, phương thức và các lớp tới một chương trình. .Net Framework cung cấp hai kiểu Attribute: các Attribute được định nghĩa trước và các Custom Attribute.

1. Xác định một Attribute trong C#

Cú pháp để xác định một Attribute trong C# như sau:

[attribute(positional_parameter, name_parameter = giá_trị, ...)]
element

Tên của Attribute và giá trị của nó được xác định bên trong dấu ngoặc vuông, ở trước phần tử từ đó thuộc tính được áp dụng cho. positional_parameter xác định thông tin thiết yếu và name_parameter xác định thông tin tùy ý.

2. Attribute được định nghĩa trước trong C#

.Net Framework cung cấp 3 Attribute được định nghĩa trước:

  • AttributeUsage
  • Conditional
  • Obsolete
3. AttributeUsage trong C#

Attribute được định nghĩa trước
AttributeUsage miêu tả cách một lớp custom Attribute có thể được sử dụng. Nó xác định kiểu của các item, mà từ đó Attribute có thể áp dụng cho.

Cú pháp để xác định Attribute này trong C# như sau:

[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)]

Tại đây:

  • Tham số validon xác định các phần tử ngôn ngữ mà Attribute có thể được đặt. Nó là một sự tổ hợp giá trị của một AttributeTargets enumerator. Giá trị mặc định là AttributeTargets.All.
  • Tham số allowmultiple (tùy ý) cung cấp giá trị cho thuộc tính AllowMultiple của attribute này, một giá trị Boolean. Nếu điều này là true, Attribute là multiuse. Giá trị mặc định là false (tức là single-use).
  • Tham số inherited (tùy ý) cung cấp giá trị cho thuộc tính Inherited của attribute này, một giá trị Boolean. Nếu nó là true, Attribute được kế thừa bởi các lớp kế thừa. Giá trị mặc định là false (không được kế thừa).
Ví dụ:

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Feild |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

3. Conditional trong C#

Attribute tiền định nghĩa này đánh dấu một phương thức có điều kiện mà sự thực thi của nó phụ thuộc vào một tiến trình tiền xử lý định danh đã cho.

Nó tạo sự biên dịch có điều kiện của các lời gọi phương thức, phụ thuộc vào giá trị đã cho, như Debug hoặcTrace. Ví dụ: nó hiển thị các giá trị của các biến trong khi debug một code.

Cú pháp để
xác định Attribute này trong C# là như sau:

[Conditional(
conditionalSymbol
)]

Ví dụ: [Conditional("DEBUG")]

Sau đây là ví dụ minh họa Conditional trong C#: Tạo hai lớp có tên lần lượt là TestAttribute, TestScharp như sau:

Lớp TestAttribute:

#define DEBUG
using System;
using System.Diagnostics;

namespace VietJackCsharp
{
class TestAttribute
{
[Conditional("DEBUG")]
public static void Message(string msg)
{
Console.WriteLine(msg);
}
}
}
Lớp TestCsharp:

using System;

namespace VietJackCsharp
{
class TestCsharp
{
static void function1()
{
TestAttribute.Message("Trong Function 1.");
function2();
}
static void function2()
{
TestAttribute.Message("Trong Function 2.");
}

public static void Main()
{
Console.WriteLine("Attribute trong C#");
Console.WriteLine("-----------------------");

TestAttribute.Message("Trong ham Main.");
function1();
Console.ReadKey();
}
}
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

attribute.PNG

4. Obsolete trong C#

Attribute tiền định nghĩa này trong C# đánh dấu một thực thể chương trình mà không nên được sử dụng. Nó cho bạn khả năng để thông báo cho compiler để loại bỏ một phần tử target cụ thể. Ví dụ, khi một phương thức mới đang được sử dụng trong một lớp và nếu bạn vẫn muốn giữ lại phương thức cũ trong lớp này, bạn có thể đánh dấu nó là obsolete bằng việc hiển thị một thông báo là phương thức mới nên được sử dụng, thay cho phương thức cũ.

Cú pháp để xác định Attribute này trong C# là như sau:

[Obsolete(
message
)]
[Obsolete(
message,
iserror
)]

Tại đây,

  • Tham số message là một chuỗi miêu tả lý do tại sao item là obsolete và cái gì được sử dụng thay cho nó.
  • Tham số iserror là một giá trị Boolean. Nếu giá trị của nó là true, compiler nên đối xử sự sử dụng của item này như là một lỗi. Giá trị mặc định là false (tức là compiler tạo một warning).
Ví dụ sau minh họa obsolete trong C#:

using System;
namespace VietJackCsharp
{
class TestCsharp
{
[Obsolete("Dung su dung PhuongThuc1, ban nen su dung PhuongThuc2", true)]
static void PhuongThuc1()
{
Console.WriteLine("Day la phuong thuc 1.");
}
static void PhuongThuc2()
{
Console.WriteLine("Day la phuong thuc 2.");
}
public static void Main()
{
PhuongThuc1(); // co dau gach do bao hieu tai day
}
}
}
Khi đó, ở lời gọi PhuongThuc1() trong hàm main() sẽ xuất hiện dấu gạch đỏ, nếu bạn rê chuột qua sẽ có một thông báo có dạng:

'VietJackCsharp.TestCsharp.PhuongThuc1()' is obsolete: 'Dung su dung PhuongThuc1, ban nen su dung PhuongThuc2'

5. Tạo Custom Attribute trong C#

Còn gọi là Attribute tùy biến hay Attribute do người dùng tự định nghĩa. .Net Framework cho phép tạo các Custom Attribute mà có thể được sử dụng để lưu giữ thông tin tường thuật và có thể được thu nhận tại runtime. Thông tin này có thể liên quan tới bất kỳ phần tử target nào phụ thuộc vào chuẩn thiết kế và yêu cầu ứng dụng.

Tạo và sử dụng Custom Attribute trong C# bao gồm 4 bước sau:

  • Khai báo một Custom Attribute
  • Xây dựng Custom Attribute
  • Áp dụng Attribute trên một phần tử chương trình target
  • Truy cập các Attribute thông qua Reflection
Bước cuối cùng liên quan tới việc viết một chương trình đơn giản để đọc qua metadata để tìm ra các notation đa dạng. Metadata là dữ liệu hoặc thông tin được sử dụng để miêu tả dữ liệu khác. Chương trình này nên sử dụng các Reflection để truy cập các Attribute tại runtime. Chúng ta sẽ bàn luận điều này trong chương tới.

6. Khai báo một Custom Attribute trong C#

Một Custom Attribute mới nên được kế thừa từ lớp System.Attribute trong C#. Ví dụ:

//a custom attribute BugFix to be assigned to a class and its members
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

public class DeBugInfo : System.Attribute
Trong code trên, chúng ta đã khai báo một Custom Attribute là DeBugInfo.


7. Xây dựng Custom Attribute trong C#

Chúng ta cùng xây dựng Custom Attribute có tên là DeBugInfo, mà lưu giữ thông tin thu được bởi việc debug bất kỳ chương trình nào. Nó có thể giữ thông tin sau:

  • Số hiệu code để bug
  • Tên lập trình viên, người nhận diện bug đó
  • Ngày review cuối cùng của code đó
  • Một thông báo dạng chuỗi để lưu giữ các lưu ý của lập trình viên
Lớp DeBugInfo có 3 thuộc tính private để lưu giữ 3 thông tin đầu tiên và một thuộc tính public để lưu giữ thông báo đó. Vì thế, số hiệu bug, tên lập trình viên, và ngày review là các tham số vị trí tương ứng của lớp DeBugInfo và thông báo là một tham số tùy ý.

Mỗi Attribute phải có ít nhất một constructor. Các tham số vị trí tương ứng nên được truyền thông qua constructor đó. Ví dụ sau minh họa lớp DeBugInfo trên:

//Vi du minh hoa mot custom attribute BugFix

[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

public class DeBugInfo : System.Attribute
{
private int bugNo;
private string developer;
private string lastReview;
public string message;

public DeBugInfo(int bg, string dev, string d)
{
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}

public int BugNo
{
get
{
return bugNo;
}
}

public string Developer
{
get
{
return developer;
}
}

public string LastReview
{
get
{
return lastReview;
}
}

public string Message
{
get
{
return message;
}
set
{
message = value;
}
}
}
8. Áp dụng Custom Attribute trong C#

Custom Attribute trong C# được áp dụng bằng việc đặt nó ngay trước target của nó:

[DeBugInfo(45, "Tran Nam", "2/8/2016", Message = "Kieu tra ve khong hop le")]
[DeBugInfo(49, "Minh Chinh", "10/10/2016", Message = "Bien chua duoc su dung")]
class Rectangle
{
//cac bien thanh vien
protected double chieu_dai;
protected double chieu_rong;
public Rectangle(double l, double w)
{
chieu_dai = l;
chieu_rong = w;
}
[DeBugInfo(55, "Tran Nam", "2/8/2016", Message = "Kieu tra ve khong hop le")]

public double tinhDienTich()
{
return chieu_dai * chieu_rong;
}
[DeBugInfo(56, "Minh Chinh", "10/10/2016")]

public void Display()
{
Console.WriteLine("Chieu dai: {0}", chieu_dai);
Console.WriteLine("Chieu rong: {0}", chieu_rong);
Console.WriteLine("Dien tich: {0}", tinhDienTich());
}
}

Trên đây là bài giới thiệu về attribute trong C# và cách sử dụng nó. Chúc các bạn một ngày học tập vui vẻ, hiệu quả.

Nguồn: vietjack.com
 
Sửa lần cuối bởi điều hành viên:
Attribute là một cơ chế được dùng để định nghĩa và khai báo các thông tin cần thiết, nhằm bổ sung và hỗ trợ khá nhiều chức năng liên quan đến việc soạn thảo, debug, cũng như biên dịch các chương trình.

Các attribute được sử dụng bằng cách đặt phía trên các thành phần (assembly, lớp, phương thức, property…) với cặp ngoặc vuông [] bao lại. Nhiều attribute có thể được sử dụng trong cùng một cặp ngoặc vuông này và được ngăn cách nhau bởi dấu phẩy “,”.

Obsolete attribute
Namespace: System.

Attribute này chỉ có một mục đích duy nhất là đánh dấu các phương thức hoặc thành phần nào đó không nên được sử dụng nữa, thông thường attribute này sẽ chỉ ra một phương pháp thay thế cho thành phần bị “đào thải” này. Thay vì xóa hẳn thành phần này đi ta vẫn giữ lại và “đánh dấu” nó để các dự án liên quan không xảy ra các lỗi về tương thích phiên bản.

Khi sử dụng các phương thức bị đánh dấu với attribute này, bạn sẽ thấy chuỗi “[deprecated]” phía trước định nghĩa của chúng cùng với 1 warning khi biên dịch.

Conditional attribute
Namespace: System.Diagnostics.

Attribute này được sử dụng để tạo ra các conditional method. Dựa vào điều kiện của các attribute mà conditional method có được biên dịch hay không. Để định nghĩa kí hiệu mà ta sử dụng trong Conditional attribute, ta sử dụng tiền chỉ thị #define, để hủy định nghĩa ta dùng tiền chỉ thị #undef.

Các chỉ thị trên phải được đặt ở đầu mỗi tập tin mà conditional method được sử dụng. Nếu bạn sử dụng nhiều Conditional attribute thì phương thức sẽ được thực thi khi một trong các điều kiện được đáp ứng
 
CHAT
  1. No shouts have been posted yet.

Chủ đề mới

VnKienthuc lúc này

Không có thành viên trực tuyến.

Định hướng

Diễn đàn VnKienthuc.com là nơi thảo luận và chia sẻ về mọi kiến thức hữu ích trong học tập và cuộc sống, khởi nghiệp, kinh doanh,...
Top