Lưu ý
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử đăng nhập hoặc thay đổi thư mục.
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử thay đổi thư mục.
Lưu ý
Các nhóm quan tâm cộng đồng hiện đã chuyển từ Yammer sang Microsoft Viva Engage. Để tham gia cộng đồng Viva Engage và tham gia vào các cuộc thảo luận mới nhất, hãy điền vào biểu mẫu Tạo nhiệm vụ truy nhập vào biểu mẫu Tài chính và Vận hành Viva Engage Cộng đồng và chọn cộng đồng bạn muốn tham gia.
Bài viết này mô tả các toán tử được hỗ trợ trong X++.
Toán tử bài tập
Toán tử bài tập sẽ thay đổi giá trị của một biến hoặc trường. Bảng sau đây hiển thị toán tử bài tập X++. Không có sự khác biệt giữa toán tử tiền tố và tiền tố.
| Nhà cung cấp dịch vụ | Sự miêu tả |
|---|---|
= |
Gán biểu thức ở bên phải dấu bằng cho biến số ở bên trái. |
+= |
Gán giá trị biến số hiện tại cộng với biểu thức ở bên phải cho biến số ở bên trái. |
++ |
Tăng biến số lên 1. |
-= |
Gán giá trị biến hiện tại trừ biểu thức ở bên phải cho biến số ở bên trái. |
-- |
Giảm biến số bằng 1. |
Ví dụ về mã cho toán tử bài tập
// An example of assignment operators and their output.
static void Example1()
{
int i = 1;
// Using the = operator. i is assigned the value of i, plus 1. i = 2.
i = i + 1;
info(strFmt("Example 1: The result is "), i); // The result is 2.
}
static void Example2()
{
int i = 1;
// Using the += operator. i is assigned the value of i, plus 1.
// i = 2 (i = i + 1).
i += 1;
info(strFmt("Example 2: The result is "), i); // The result is 2.
}
static void Example3()
{
int i = 1;
// Using the ++ operator. i is incremented by 1, and then
// by 1 again in the second statement. The final value of i is 3.
i++;
++i;
info(strFmt("Example 3: The result is "), i); // The result is 3.
}
static void Example4()
{
int i = 1;
// Using the -= operator. i is assigned the value of i minus 1.
// i = 0 (i = i - 1).
i -= 1;
info(strFmt("Example 4: The result is "), i); // The result is 0.
}
static void Example5()
{
int i = 1;
// Using the -- operator. i is decremented by 1, and then by
// 1 again in the second statement. The final value of i is -1.
i--;
--i;
info(strFmt("Example 5: The result is "), i); // The result is -1.
}
Toán tử số học
Sử dụng toán tử số học để thực hiện tính toán số. Hầu hết các toán tử là nhị phân và có hai toán hạng. Tuy nhiên, toán tử not (~) là unary và chỉ lấy một toán hạng. Cú pháp cho toán tử nhị phân: expression1Biểu thức ArithmeticOperator2 Cú pháp cho các toán tử đơn phân: Biểu thức ArithmeticOperator1
| Nhà cung cấp dịch vụ | Sự miêu tả |
|---|---|
<< |
Toán tử shift trái thực hiện expression2 left shift (phép nhân với 2) trên expression1. |
>> |
Toán tử shift phải thực hiện biểu thức 2 shift phải (chia cho 2) trên expression1. |
* |
Toán tử nhân nhân biểu thức1 với expression2. |
/ |
Toán tử chia chia biểu thức 1 cho expression2. |
DIV |
Toán tử chia số nguyên thực hiện một phép chia số nguyên của expression1 với expression2. |
MOD |
Toán tử số nguyên còn lại trả về phần còn lại của phép chia số nguyên của expression1 bởi expression2. |
~ |
Toán tử không phải hoặc toán tử đơn phân thực hiện thao tác không nhị phân. |
& |
Toán tử binary AND thực hiện một nhị phân và thao tác trên expression1 và expression2. |
^ |
Toán tử XOR nhị phân thực hiện thao tác XOR nhị phân trên expression1 và expression2. |
| |
Toán tử OR nhị phân thực hiện một nhị phân hoặc thao tác trên expression1 và expression2. |
+ |
Toán tử dấu cộng sẽ thêm expression1 vào expression2. |
- |
Toán tử trừ trừ biểu thức 2 từexpression1. |
? |
Toán tử thứ ba có ba biểu thức: expression1 ? expression2 : expression3. Nếu expression1 là true, thì trả về expression2 . Nếu không, trả về expression3 . |
Ví dụ về mã cho toán tử số học
int a = 1 << 4; // Perform four left shifts on 1 (1*2*2*2*2). a=16.
int b = 16 >> 4; // Perform four right shifts on 16 (16/2/2/2/2). b=1.
int c = 4 * 5; // Multiply 4 by 5. c=20.
int d = 20 / 5; // Divide 20 by 5. d=4.
int e = 100 div 21; // Return the integer division of 100 by 21. e=4 (4*21 = 84, remainder 16).
int f = 100 mod 21; // Return the remainder of the integer division of 100 by 21. f=16.
int g = ~1; // Binary negate 1 (all bits are reversed). g=-2.
int h = 1 & 3; // Binary AND. Return the bits that are in common in the two integers. h=1.
int i = 1 | 3; // Binary OR. Return the bits that are set in either 1 or 3. i=3.
int j = 1 ^ 3; // Binary XOR. Return the bits that are set in 1 and NOT set in 3, and vice versa. j=2.
int k = 1 + 3; // Add 1 and 3. k=4.
int l = 3 - 1; // Subtract 1 from 3. l=2.
int m = (400 > 4) ? 1 : 5; // If 400>4, 1 is returned. Otherwise, 5 is returned. Because 400>4, 1 is returned. m=1.
Toán tử biểu thức
Toán tử as biểu is thức và kiểm soát nhiệm vụ downcast. Bài tập downcast liên quan đến lớp học hoặc kế thừa bảng. Câu lệnh bài tập ngầm định có thể gây ra lỗi khó dự đoán và chẩn đoán. Sử dụng từ as khóa để làm cho downcasts của bạn rõ ràng. Sử dụng từ is khóa để kiểm tra xem sự kiện downcast có hợp lệ tại thời gian chạy hay không.
Từ khóa dưới dạng
Sử dụng từ as khóa cho bài tập downcast từ biến lớp cơ sở đến biến lớp dẫn xuất. Từ as khóa cho các lập trình viên khác và trình biên soạn rằng bạn tin rằng downcast là hợp lệ trong thời gian chạy.
- Trình biên dịch báo cáo lỗi cho các câu lệnh phân công downcast thiếu từ
askhóa. - Tại thời gian chạy, từ
askhóa gây ra câu lệnh gán downcast để gánnullnếu downcast không hợp lệ. - Sử dụng từ khóa
isđể kiểm tra an toàn xem từ khóa có hoạtasđộng hay không.
Ví dụ về mã cho từ khóa
Trong ví dụ mã sau đây, lớp DerivedClass sẽ mở rộng lớp BaseClass . Ví dụ về mã chứa hai bài tập hợp lệ giữa các biến basecvà biến số dẫn xuất. Việc gán upcast cho basec không yêu as cầu từ khóa, nhưng việc gán downcast để derivedc yêu cầu từ as khóa. Mã sau đây biên dịch và chạy mà không có lỗi.
static void AsKeywordExample()
{
// DerivedClass extends BaseClass.
BaseClass basec;
DerivedClass derivedc;
// BottomClass extends DerivedClass.
BottomClass bottomc;
derivedc = new DerivedClass();
// AS is not required for an upcast assignment like this.
basec = derivedc;
// AS is required for a downcast assignment like this.
derivedc = basec as DerivedClass;
bottomc = new BottomClass();
// AS causes this invalid downcast to assign null.
bottomc = basec as DerivedClass;
}
Từ khóa là
Từ is khóa kiểm tra xem đối tượng có phải là loại con của lớp đã xác định hay không. Biểu is thức trả về true nếu đối tượng là loại con của lớp hoặc nếu đối tượng cùng loại với lớp. Trình biên dịch is báo cáo lỗi nếu biểu thức từ khóa so sánh hai loại nhưng cả hai kiểu này không phải là loại con của kiểu khác và chúng không cùng kiểu. Trình biên dịch báo cáo lỗi tương tự cho bất kỳ câu lệnh gán thuần nào giữa hai loại, trong đó cả hai loại không phải là loại con của loại kia và chúng không cùng loại. Tại thời điểm chạy, loại biến tham chiếu đến đối tượng cơ sở không liên quan đến từ khóa is . Từ is khóa gây ra hệ thống để xác minh các đối tượng mà các biến tham chiếu, không phải là loại khai báo của biến tham chiếu đến các đối tượng.
Ví dụ về mã cho từ khóa là
Các ví dụ về mã sau đây minh họa các điều kiện kiểm soát việc một biểu thức trả về isgiá trị đúng haysai. Các ví dụ về mã phụ thuộc vào thực tế là lớp Biểu mẫu và lớp Query đều mở rộng lớp TreeNode .
// The compiler issues an error for the following code.
// The compiler ascertains that the Form class and the Query class are not
// part of the same inheritance hierarchy. Both the Form class and the Query class
// extend the TreeNode class, but neither Form nor Query is a subtype of the other.
Form myForm = new Form();
info(strFmt("%1", (myForm is Query)));
// The Infolog displays 0 during run time, where 0 means false. No supertype
// object can be considered to also be of its subtype class.
TreeNode myTreeNode = new TreeNode();
info(strFmt("%1", (myTreeNode is Form)));
// The Infolog displays 0 during run time, where 0 means false. A null
// reference causes the is expression to return false.
Form myForm;
info(strFmt("%1", (myForm is Form)));
// The Infolog displays 1 during run time, where 1 means true.
// An object is an instance of its own class type.
Form myForm = new Form();
info(strFmt("%1", (myForm is Form)));
// The Infolog displays 1 during run time, where 1 means true.
// Every subtype is also of its supertype.
Form myForm = new Form();
info(strFmt("%1", (myForm is TreeNode)));
// The Infolog displays 1 during run time, where 1 means true.
// The type of the underlying object matters in the is expression,
// not the type of the variable that references the object.
Form myForm = new Form();
TreeNode myTreeNode;
myTreeNode = myForm; // Upcast.
info(strFmt("%1", (myTreeNode is Form)));
Ví dụ về mã cho is và as keywords
Ví dụ về mã sau đây chứa cách sử dụng điển hình của từ is khóa. Từ as khóa được sử dụng sau khi từ is khóa xác minh rằng từ khóa as thành công. Trong ví dụ này, từ khóa is và as chữ hoa để làm cho chúng dễ nhìn thấy hơn.
static void IsKeywordExample()
{
DerivedClass derivedc;
BaseClass basec;
basec = new DerivedClass(); // An upcast.
if (basec IS DerivedClass)
{
info("Test 1: (basec IS DerivedClass) is true. Good.");
derivedc = basec AS DerivedClass;
}
basec = new BaseClass();
if (!(basec IS DerivedClass))
{
info("Test 2: !(basec IS DerivedClass) is true. Good.");
}
}
//Output to the Infolog
Test 1: (basec IS DerivedClass) is true. Good.
Test 2: (!(basec IS DerivedClass)) is true. Good.
Lớp đối tượng như một trường hợp đặc biệt
Lớp Đối tượng có thể xuất hiện dưới dạng một trường hợp đặc biệt trong chức năng kế thừa. Trình biên dịch bỏ qua loại kiểm tra nhiệm vụ đến và từ các biến được khai báo là loại đối tượng. Một số lớp kế thừa từ lớp Object , một số lớp thừa kế từ một lớp khác và một số lớp không kế thừa từ bất kỳ lớp nào. Mặc dù lớp Hộp thoại không kế thừa từ bất kỳ lớp nào nhưng câu lệnh gán và cuộc gọi trong ví dụ mã sau đây vẫn hoạt động. Tuy nhiên, nếu gán là bank4 = dlog3;, nó sẽ không biên dịch thời gian, bởi vì các lớp ngân hàng và hộp thoại không có mối quan hệ kế thừa với nhau. Trình biên dịch thực hiện chỉ có một xác nhận nhỏ về gán cho một biến được tuyên bố là của lớp đối tượng. Trình biên dịch xác minh rằng mục được gán cho biến đối tượng là một thể hiện của một lớp. Trình biên dịch không cho phép gán phiên bản bộ đệm bảng cho biến Đối tượng. Ngoài ra, trình biên dịch không cho phép gán kiểu dữ liệu nguyên thủy, intstrchẳng hạn như hoặc , cho biến Đối tượng.
static void ObjectExample()
{
Bank bank4;
Object obj2;
Dialog dlog3 = new Dialog("Test 4.");
obj2 = dlog3; // The assignment does work.
obj2.run(false); // The call causes the dialog to appear.
info("Test 4a is finished.");
}
Bảng
Tất cả các bảng kế thừa trực tiếp từ bảng hệ thống Chung, trừ khi chúng kế thừa rõ ràng từ một bảng khác. Không thể tạo đối tượng bảng Chung. Nó không tồn tại trong cơ sở dữ liệu vật lý cơ sở. Bảng Common kế thừa từ lớp xRecord , is nhưng theo một cách đặc biệt không thích hợp cho từ khóa hoặc từ khóa as . Khi từ khóa as được sử dụng để thực hiện một downcast không hợp lệ giữa các bảng, biến đích tham chiếu một thực thể không phải là null không sử dụng được. Bất kỳ nỗ lực để hủy tham chiếu biến mục tiêu sẽ gây ra một lỗi dừng chương trình.
Is và as keywords and extended data types
Mỗi kiểu dữ liệu mở rộng đều có một thuộc tính Mở rộng. Kiểu kế thừa mà thuộc tính này điều khiển khác với kiểu thừa kế và từ is khóa as được thiết kế cho.
Toán tử quan hệ
Bảng sau đây liệt kê các toán tử quan hệ có thể được sử dụng trong X++. Hầu hết các toán tử là nhị phân và có hai toán hạng. Tuy nhiên, toán tử not (!) là unary và chỉ lấy một toán hạng. Cú pháp cho toán tử nhị phân: expression1relationalOperatorexpression2 Cú pháp cho các toán tử đơn phân: relationalOperatorexpression1
| Nhà cung cấp dịch vụ | Sự miêu tả |
|---|---|
like |
Toán tử quan hệ tương tự trả về true nếu expression1 giống như expression2. |
== |
Toán tử quan hệ bằng nhau trả về true nếu cả hai biểu thức đều bằng nhau. |
>= |
Toán tử quan hệ lớn hơn hoặc bằng trả về true nếu expression1 lớn hơn hoặc bằng expression2. |
<= |
Toán tử quan hệ nhỏ hơn hoặc bằng trả về true nếu expression1 nhỏ hơn hoặc bằng expression2. |
> |
Toán tử quan hệ lớn hơn trả về true nếu expression1 lớn hơn expression2. |
< |
Toán tử quan hệ nhỏ hơn trả về true nếu expression1 nhỏ hơn expression2. |
!= |
Toán tử quan hệ không bằng nhau trả về true nếu expression1 khác với biểu thức (nghĩa là nếu biểu thức đó không bằng) 2. |
&& |
Toán tử quan hệ và trả về true nếu cả expression1 và expression2 đều đúng. |
|| |
Toán tử quan hệ hoặc trả về true nếu expression1 hoặc expression2 là true hoặc nếu cả hai đều đúng. |
! |
Toán tử quan hệ không hoặc không liên quan phủ định biểu thức. Nó trả về true nếu biểu thức là false và false nếu biểu thức là đúng. |
Toán tử like
Toán like tử có thể dùng * làm ký tự đại diện cho không hoặc nhiều ký tự và ? làm ký tự đại diện cho một ký tự. Độ dài tối đa của toán hạng là 1.000 ký tự. Toán like tử được SQL cơ sở đánh giá, vì vậy kết quả có thể khác nhau trên các cài đặt khác nhau. Nếu biểu thức mà bạn đang so sánh có chứa đường dẫn tệp, bạn phải bao gồm bốn dấu gạch chéo ngược giữa mỗi phần tử, như minh họa trong ví dụ sau đây.
select * from xRefpaths
where xRefPaths.Path like "\\\\Classes\\\\AddressSelectForm"
Toán tử dấu bằng (==)
Khi bạn sử dụng toán tử dấu bằng (==) để so sánh các đối tượng, các tham chiếu đối tượng sẽ được so sánh, chứ không phải bản thân các đối tượng. Hành vi này có thể gây ra vấn đề nếu bạn so sánh hai đối tượng, một trong số đó nằm trên máy chủ, và một trong số đó nằm trên khách hàng. Trong những trường hợp này, bạn nên sử dụng phương pháp bằng trong lớp Đối tượng. Bạn có thể ghi đè phương pháp này để xác định ý nghĩa của phương pháp này đối với hai đối tượng là bằng nhau. Nếu bạn không ghi đè phương pháp bằng nhau, so sánh sẽ giống với so sánh được thực hiện bởi toán tử dấu bằng (==).
Ví dụ về mã cho các toán tử quan hệ
"Jones" like "Jo?es" // Returns true, because the ? is equal to any single character.
"Fabrikam, Inc." like "Fa*" // Returns true, because the * is equal to zero or more characters.
(( 42 * 2) == 84) // Returns true, because 42*2 is equal to 84.
today() >= 1\1\1980 // Returns true, because today is later than January 1, 1980.
((11 div 10) >= 1) // Returns true, because 11 div 10 is 1 (therefore, >= 1 is true).
(11<= 12) // Returns true, because 11 is less than 12.
((11 div 10) > 1) // Returns false, because 11 div 10 is 1.
(11 div 10) < 1) // Returns false, because 11 div 10 is 1.
(11 != 12) // Returns true, because 11 is not equal to 12.
(1 == 1) && (3 > 1) // Returns true, because both expressions are true.
Mức ưu tiên toán tử
Thứ tự mà biểu thức kết hợp được đánh giá có thể rất quan trọng. Ví dụ, cho (x + y / 100) kết quả khác, tùy thuộc vào việc cộng hoặc chia được thực hiện trước tiên. Bạn có thể sử dụng dấu ngoặc đơn (()) để cho trình biên dịch biết rõ ràng cách đánh giá biểu thức. Ví dụ: bạn có thể chỉ định (x + y) / 100. Nếu bạn không cho trình biên dịch biết rõ thứ tự mà bạn muốn thực hiện các thao tác, thứ tự sẽ dựa trên mức ưu tiên được gán cho các toán tử. Ví dụ: toán tử phép chia có mức ưu tiên cao hơn toán tử phép cộng. Vì vậy, đối với biểu x + y / 100thức, trình biên dịch đánh giá đầu y / 100 tiên. Nói cách khác, x + y / 100 tương đương với x + (y / 100). Để dễ đọc và duy trì mã của bạn, hãy rõ ràng. Sử dụng dấu ngoặc đơn để cho biết toán tử nào cần được đánh giá trước tiên. Bảng sau đây liệt kê các toán tử theo thứ tự ưu tiên. Toán tử xuất hiện trong bảng càng cao thì mức ưu tiên của toán tử càng cao. Toán tử có mức ưu tiên cao hơn được đánh giá trước các toán tử có mức ưu tiên thấp hơn. Lưu ý rằng mức ưu tiên toán tử của X++ không giống với mức ưu tiên toán tử của các ngôn ngữ khác, chẳng hạn như C# và Java.
| Nhóm toán tử, theo thứ tự ưu tiên | Nhà cung cấp dịch vụ |
|---|---|
| Unary | - ~ ! |
| Nhân, dịch chuyển, bitwise AND, bitwise exclusive OR | * / % DIV << >> & ^ |
| Phụ gia, bitwise bao gồm OR | + - | |
| Quan hệ, bình đẳng | < <= == != > >= like as is |
| Lô-gic (AND, OR) |
&&
||
|
| Điều kiện | ? : |
Toán tử trên cùng một dòng có ưu tiên bằng nhau. Nếu biểu thức có nhiều hơn một trong các toán tử này, biểu thức sẽ được đánh giá từ trái sang phải, trừ khi toán tử gán được sử dụng. (Toán tử bài tập được đánh giá từ phải sang trái.) Ví dụ, && (lô-gic AND) || và ( ORlô-gic ) có ưu tiên giống nhau và được đánh giá từ trái sang phải. Do đó:
-
0 && 0 || 1bằng1 -
1 || 0 && 00bằng .