C # - Thuộc tính
An attributelà một thẻ khai báo được sử dụng để truyền tải thông tin trong thời gian chạy về các hành vi của các phần tử khác nhau như lớp, phương thức, cấu trúc, bộ liệt kê, hợp ngữ, v.v. trong chương trình của bạn. Bạn có thể thêm thông tin khai báo vào chương trình bằng cách sử dụng một thuộc tính. Thẻ khai báo được mô tả bằng dấu ngoặc vuông ([]) đặt phía trên phần tử mà nó được sử dụng.
Các thuộc tính được sử dụng để thêm siêu dữ liệu, chẳng hạn 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 vào chương trình. .Net Framework cung cấp hai loại thuộc tính: thuộc tính được xác định trước và thuộc tính được xây dựng tùy chỉnh .
Chỉ định một thuộc tính
Cú pháp để chỉ định một thuộc tính như sau:
[attribute(positional_parameters, name_parameter = value, ...)]
element
Tên của thuộc tính và các giá trị của nó được chỉ định trong dấu ngoặc vuông, trước phần tử mà thuộc tính được áp dụng. Tham số vị trí chỉ định thông tin cần thiết và tham số tên chỉ định thông tin tùy chọn.
Thuộc tính được xác định trước
.Net Framework cung cấp ba thuộc tính được xác định trước:
- AttributeUsage
- Conditional
- Obsolete
AttributeUsage
Thuộc tính được xác định trước AttributeUsagemô tả cách một lớp thuộc tính tùy chỉnh có thể được sử dụng. Nó chỉ định các loại mặt hàng mà thuộc tính có thể được áp dụng.
Cú pháp để chỉ định thuộc tính này như sau:
[AttributeUsage (
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
Ở đâu,
Tham số validon chỉ định các phần tử ngôn ngữ mà thuộc tính có thể được đặt vào. Nó là sự kết hợp của giá trị của một AttributeTargets của người điều tra . Giá trị mặc định là AttributeTargets.All .
Tham số allowmultiple (tùy chọn) cung cấp giá trị cho thuộc tính AllowMultiple của thuộc tính này, một giá trị Boolean. Nếu điều này là đúng, thuộc tính này là đa dụng. Giá trị mặc định là false (sử dụng một lần).
Tham số được kế thừa (tùy chọn) cung cấp giá trị cho thuộc tính Được kế thừa của thuộc tính này, một giá trị Boolean. Nếu nó là true, thuộc tính được kế thừa bởi các lớp dẫn xuất. Giá trị mặc định là false (không được kế thừa).
Ví dụ,
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
Có điều kiện
Thuộc tính được xác định 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 số nhận dạng tiền xử lý được chỉ định.
Nó gây ra việc biên dịch có điều kiện các cuộc gọi phương thức, tùy thuộc vào giá trị được chỉ định chẳng hạn như Debug hoặc là Trace. Ví dụ, nó hiển thị giá trị của các biến trong khi gỡ lỗi mã.
Cú pháp để chỉ định thuộc tính này như sau:
[Conditional(
conditionalSymbol
)]
Ví dụ,
[Conditional("DEBUG")]
Ví dụ sau minh họa thuộc tính -
#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
Lỗi thời
Thuộc tính được xác định trước này đánh dấu một thực thể chương trình không đượ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 phần tử đí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 phương thức mới nên được sử dụng thay vì phương thức cũ.
Cú pháp để chỉ định thuộc tính này như sau:
[Obsolete (
message
)]
[Obsolete (
message,
iserror
)]
Ở đâu,
Thông báo tham số , là một chuỗi mô tả lý do tại sao mặt hàng bị lỗi thời và cái gì để thay thế.
Tham số iserror , là một giá trị Boolean. Nếu giá trị của nó là true, trình biên dịch sẽ coi việc sử dụng mục là một lỗi. Giá trị mặc định là false (trình biên dịch tạo ra cảnh báo).
Chương trình sau đây chứng minh đ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 cho biết -
Don't use OldMethod, use NewMethod instead
Tạo các thuộc tính tùy chỉnh
.Net Framework cho phép tạo các thuộc tính 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 chạy. Thông tin này có thể liên quan đến bất kỳ phần 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 thuộc tính tùy chỉnh bao gồm bốn bước:
- Khai báo thuộc tính tùy chỉnh
- Tạo thuộc tính tùy chỉnh
- Áp dụng thuộc tính tùy chỉnh trên một phần tử chương trình mục tiêu
- Truy cập các thuộc tính thông qua phản ánh
Bước cuối cùng liên quan đến việc viết một chương trình đơn giản để đọc qua siêu dữ liệu để tìm các ký hiệu khác nhau. Siêu dữ liệu là dữ liệu về 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 phản xạ để truy cập các thuộc tính trong thời gian chạy. Điều này chúng ta sẽ thảo luận trong chương tiếp theo.
Khai báo thuộc tính tùy chỉnh
Một thuộc tính tùy chỉnh mới phải được bắt nguồn từ System.Attributelớp họ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 đoạn mã trước, chúng ta đã khai báo một thuộc tính tùy chỉnh có tên là DeBugInfo .
Tạo thuộc tính tùy chỉnh
Hãy để chúng tôi xây dựng một thuộc tính tùy chỉnh có tên DeBugInfo , thuộc tính này lưu trữ thông tin thu được bằng cách gỡ lỗi bất kỳ chương trình nào. Hãy để nó lưu trữ các thông tin sau -
- Số mã của lỗi
- Tên của nhà phát triển đã xác định lỗi
- Ngày xem xét mã cuối cùng
- Thông báo chuỗi để lưu trữ nhận xét của nhà phát triển
Lớp DeBugInfo có ba thuộc tính riêng để lưu trữ ba thông tin đầu tiên và thuộc tính chung để lưu thông báo. 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 DeBugInfo và thông báo là một tham số tùy chọn hoặc có tên.
Mỗi thuộc tính phải có ít nhất một hàm tạo. Các tham số vị trí phải được chuyển qua hàm tạo. Đoạn mã sau cho thấy lớp DeBugInfo :
//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 {
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;
}
}
}
Áp dụng thuộc tính tùy chỉnh
Thuộc tính được áp dụng bằng cách đặt nó ngay trước mục tiêu của nó -
[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012", 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/10/2012", Message = "Return type mismatch")]
public double GetArea() {
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
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 ta lấy thông tin thuộc tính bằng cách sử dụng đối tượng lớp Reflection.