Attribute (thuộc tính) là một thẻ khai báo được sử dụng để truyền tải thông tin lúc thực thi về hành vi của các thành phần khác nhau như các lớp, phương thức, cấu trúc, liệt kê, tập hợp,... trong chương trình của bạn.
Bạn có thể thêm thông tin khai báo vào một chương trình bằng cách sử dụng một attribute. Thẻ khai báo được mô tả bằng dấu ngoặc vuông ([]) được đặt phía trên phần tử được sử dụng.
Các attribute được sử dụng để thêm siêu dữ liệu, như hướng dẫn trình biên dịch và các thông tin khác như nhận xét, mô tả, phương thức và lớp cho một chương trình.
.NET Framework cung cấp hai loại attribute: attribute được định nghĩa trước và attribute được xây dựng tùy chỉnh .
Cú pháp để chỉ định một attribute như sau:
[attribute(positional_parameters, name_parameter = value, ...)]
element
Tên của attribute và các giá trị của nó được chỉ định trong dấu ngoặc vuông, trước phần tử được áp dụng attribute. Tham số vị trí xác định thông tin cần thiết và tham số tên chỉ định thông tin tùy chọn.
.NET Framework cung cấp ba attribute được định nghĩa trước:
Attribute được định nghĩa trước AttributeUsage mô tả cách sử dụng một lớp attribute tùy chỉnh. Nó chỉ định các loại thành phần mà thuộc tính có thể được áp dụng.
Cú pháp để chỉ định attribute này như sau:
[AttributeUsage (
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
Ở đây:
Ví dụ:
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
Attribute được định nghĩa trước này đánh dấu một phương thức có điều kiện mà việc thực thi phụ thuộc vào một định danh tiền xử lý được chỉ định.
Nó gây ra việc biên dịch có điều kiện các lệnh gọi phương thức, tùy thuộc vào giá trị được chỉ định như Debug hoặc Trace. Ví dụ, nó hiển thị các giá trị của các biến trong khi gỡ lỗi mã.
Cú pháp để chỉ định attribute này như sau:
[Conditional(conditionalSymbol)]
Ví dụ:
[Conditional("DEBUG")]
Ví dụ sau đây cho thấy attribute:
#define DEBUG
using System;
using System.Diagnostics;
public class Myclass
{
[Conditional("DEBUG")]
public static void Message(string msg)
{
Console.WriteLine(msg);
}
}
class Test
{
static void function1()
{
Myclass.Message("In Function 1.");
function2();
}
static void function2()
{
Myclass.Message("In Function 2.");
}
public static void Main()
{
Myclass.Message("In Main function.");
function1();
Console.ReadKey();
}
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau
In Main function
In Function 1
In Function 2
Attribute được định nghĩa trước này đánh dấu một thành phần của chương trình không nên được sử dụng. Nó cho phép bạn thông báo cho trình biên dịch để loại bỏ một thành phần đích 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, bạn có thể đánh dấu nó là lỗi thời bằng cách hiển thị một thông báo, nên sử dụng phương thức mới, thay vì phương thức cũ.
Cú pháp để chỉ định attribute này như sau:
[Obsolete(message)]
// or
[Obsolete(message, iserror)]
Ở đây:
Chương trình sau đây minh họa điều này:
using System;
public class MyClass
{
[Obsolete("Don't use OldMethod, use NewMethod instead", true)]
static void OldMethod()
{
Console.WriteLine("It is the old method");
}
static void NewMethod()
{
Console.WriteLine("It is the new method");
}
public static void Main()
{
OldMethod();
}
}
Khi bạn cố gắng biên dịch chương trình, trình biên dịch sẽ đưa ra thông báo lỗi
Don't use OldMethod, use NewMethod instead
.NET Framework cho phép tạo các attribute tùy chỉnh có thể được sử dụng để lưu trữ thông tin khai báo và có thể được truy xuất tại thời điểm thực thi.
Thông tin này có thể liên quan đến bất kỳ yếu tố mục tiêu nào tùy thuộc vào tiêu chí thiết kế và nhu cầu ứng dụng.
Tạo và sử dụng các attribute tùy chỉnh bao gồm bốn bước:
Bước cuối cùng liên quan đến việc viết một chương trình đơn giản đọc siêu dữ liệu để tìm các ký hiệu khác nhau.
Siêu dữ liệu là dữ liệu hoặc thông tin được sử dụng để mô tả dữ liệu khác. Chương trình này nên sử dụng Reflection để truy cập các attribute trong lúc thực thi. Điều này chúng ta sẽ thảo luận trong chương tiếp theo.
Một attribute tùy chỉnh mới phải được bắt nguồn từ lớp System.Attribute. 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 DebugInfoAttribute : System.Attribute
{}
Trong ví dụ trên, chúng tôi đã khai báo một attribute tùy chỉnh có tên DebugInfoAttribute.
Tip: Tên của attribute nên có hậu tố Attribute để phân biệt với các lớp thông thường.
Chúng tôi sẽ xây dựng một attribute tùy chỉnh có tên DebugInfoAttribute, nơi lưu trữ thông tin thu được bằng cách gỡ lỗi bất kỳ chương trình nào. Nó lưu trữ các thông tin sau:
Lớp DebugInfoAttribute có ba thuộc tính riêng để lưu trữ ba thông tin đầu tiên và thuộc tính public để lưu trữ nhận xét. Do đó, số lỗi, tên nhà phát triển và ngày xem xét là các tham số vị trí của lớp DebugInfoAttribute và nhận xét là một tham số tùy chọn hoặc được đặt tên.
Mỗi attribute phải có ít nhất một phương thức khởi tạo. Các tham số vị trí nên được truyền qua phương thức khởi tạo. Đoạn mã sau đây cho thấy lớp DebugInfoAttribute:
//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 DebugInfoAttribute : System.Attribute
{
private int _bugNo;
private string _developer;
private string _lastReview;
public string _message;
public DebugInfoAttribute(int bg, string dev, string d)
{
_bugNo = bg;
_developer = dev;
_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;
}
}
}
Attribute được áp dụng bằng cách đặt nó ngay trước thành phần mà bạn mong muốn:
[DebugInfo(45, "Zara Ali", "12/8/2020", Message = "Return type mismatch")]
[DebugInfo(49, "Nuha Ali", "10/10/2019", Message = "Unused variable")]
class Rectangle
{
//member variables
protected double _length;
protected double _width;
public Rectangle(double l, double w)
{
_length = l;
_width = w;
}
[DebugInfo(55, "Zara Ali", "19/04/2020", Message = "Return type mismatch")]
public double GetArea()
{
return _length * _width;
}
[DebugInfo(56, "Zara Ali", "19/10/2019")]
public void Display()
{
Console.WriteLine("Length: {0}", _length);
Console.WriteLine("Width: {0}", _width);
Console.WriteLine("Area: {0}", GetArea());
}
}
Trong chương tiếp theo, chúng tôi lấy thông tin attribute bằng cách sử dụng một đối tượng lớp Reflection.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong loạt bài này, tôi sẽ xem xét một số
Ngôn ngữ C# đã bật các bộ tăng áp liên
Trong bài viết này, chúng ta sẽ tìm hiểu lớp tiện ích ZipFile trong C#, cách nén tập tin và thư mục, cùng với giải nén tập tin zip.
Bài viết này sẽ giới thiệu cách đơn giản nhất mà tôi đã tìm thấy để đọc và ghi file Excel bằng C# sử dụng ExcelMapper.