Pengendali X++

Nota

Kumpulan minat komuniti kini telah berpindah daripada Yammer kepada Microsoft Viva Engage. Untuk menyertai komuniti Viva Engage dan mengambil bahagian dalam perbincangan terkini, isi borang Minta akses kepada Kewangan dan Operasi Viva Engage Komuniti dan pilih komuniti yang anda mahu sertai.

Artikel ini menerangkan pengendali yang disokong dalam X++.

Pengendali tugasan

Pengendali tugasan mengubah nilai pembolehubah atau medan. Jadual berikut menunjukkan pengendali tugasan X++. Tiada perbezaan antara pengendali awalan dan pascafiks.

Pengendali Description
= Tetapkan ungkapan di sebelah kanan tanda sama kepada pembolehubah di sebelah kiri.
+= Tetapkan nilai pembolehubah semasa ditambah ungkapan di sebelah kanan kepada pembolehubah di sebelah kiri.
++ Tambah pembolehubah sebanyak 1.
-= Tetapkan nilai pembolehubah semasa tolak ungkapan di sebelah kanan kepada pembolehubah di sebelah kiri.
-- Kurangkan pembolehubah sebanyak 1.

Contoh kod untuk pengendali tugasan

// 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. 
}

Operator aritmetik

Gunakan pengendali aritmetik untuk melakukan pengiraan berangka. Kebanyakan pengendali adalah binari dan mengambil dua operan. Walau bagaimanapun, pengendali not (~) adalah unary dan hanya mengambil satu operan. Sintaks untuk pengendali binari: ekspresi1Ekspresi ArithmeticOperator2 Sintaks untuk pengendali unari: Ekspresi ArithmeticOperator1

Pengendali Description
<< Pengendali anjakan kiri melakukan anjakan kiri ekspresi2 (pendaraban dengan 2) pada ungkapan1.
>> Pengendali anjakan kanan melakukan anjakan kanan ekspresi2 (pembahagian dengan 2) pada ungkapan1.
* Pengendali darab mendarabkan ungkapan1 dengan ungkapan2.
/ Pengendali bahagikanungkapan1 dengan ungkapan2.
DIV Pengendali pembahagian integer melaksanakan pembahagian integer ekspresi1 dengan ungkapan2.
MOD Pengendali baki integer mengembalikan baki pembahagian integer ungkapan1 dengan ungkapan2.
~ Pengendali bukan , atau pengendali unary, melakukan operasi bukan binari.
& Pengendali binari AND melakukan binari dan operasi pada ekspresi1 dan ekspresi2.
^ Pengendali XOR binari melakukan operasi XOR binari pada ekspresi1 dan ekspresi2.
| Pengendali ATAU binari melakukan binari atau operasi pada ekspresi1 dan ekspresi2.
+ Pengendali tambah menambah ekspresi1 kepada ekspresi2.
- Pengendali tolakungkapan2 daripada ungkapan1.
? Pengendali terner mengambil tiga ungkapan: ungkapan1 ? ungkapan2 : ungkapan3. Jika ungkapan1 adalah benar, ungkapan2 dikembalikan. Jika tidak, ekspresi3 dikembalikan.

Contoh kod untuk pengendali aritmetik

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.

Pengendali ungkapan

Pengendali dan asis ekspresi mengawal tugasan downcast. Tugasan terpurut melibatkan pewarisan kelas atau jadual. Pernyataan tugasan yang secara tersirat boleh menyebabkan ralat yang sukar untuk diramalkan dan didiagnosis. Gunakan as kata kunci untuk menjadikan orang yang tersungut anda eksplisit. Gunakan is kata kunci untuk menguji sama ada downcast adalah sah pada masa jalan.

Kata kunci sebagai

Gunakan kata as kunci untuk tugasan yang menurunkan daripada pemboleh ubah kelas asas kepada pembolehubah kelas terbitan. Kata as kunci memberitahu pengaturcara lain dan pengkompil bahawa anda percaya bahawa downcast adalah sah semasa masa jalan.

  • Pengkompil melaporkan ralat untuk pernyataan tugasan downcast yang tidak mempunyai as kata kunci.
  • Pada masa jalanan, as kata kunci menyebabkan pernyataan tugasan downcast diperuntukkan null jika downcast tidak sah.
  • Gunakan kata kunci untuk is menguji sama ada kata kunci berfungsi as dengan selamat.

Contoh kod untuk kata kunci sebagai

Dalam contoh kod berikut, kelas DerivedClass memanjangkan kelas BaseClass . Contoh kod mengandungi dua tugasan yang sah antara pembolehubah asas dan terbitannya . Tugasan upcast kepada basec tidak memerlukan as kata kunci, tetapi tugasan downcast kepada derivedc memerlukan as kata kunci. Kod berikut menyusun dan berjalan tanpa ralat.

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;
}

Kata kunci adalah

Kata is kunci mengesahkan sama ada objek ialah subjenis kelas tertentu. Ungkapan mengembalikan isbenar jika objek ialah subjenis kelas, atau jika objek adalah jenis yang sama dengan kelas. Pengkompil melaporkan ralat jika is ungkapan kata kunci membandingkan dua jenis, tetapi kedua-dua jenis bukan subjenis yang lain dan ia bukan daripada jenis yang sama. Pengkompil melaporkan ralat yang serupa untuk mana-mana pernyataan tugasan biasa antara dua jenis, di mana kedua-dua jenis tidak merupakan subjenis yang lain, dan ia bukan daripada jenis yang sama. Pada masa jalan, jenis pembolehubah yang merujuk objek asas tidak berkaitan dengan is kata kunci. is Kata kunci menyebabkan sistem mengesahkan objek yang dirujuk oleh pembolehubah, bukan jenis pembolehubah yang diisytiharkan yang merujuk objek.

Contoh kod untuk kata kunci is

Contoh kod berikut menggambarkan syarat yang mengawal sama ada is ungkapan mengembalikan benar atau palsu. Contoh kod bergantung pada fakta bahawa kelas Borang dan kelas Pertanyaan kedua-duanya memanjangkan kelas 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)));

Contoh kod untuk kata kunci is dan as

Contoh kod berikut mengandungi penggunaan is biasa kata kunci. as Kata kunci digunakan selepas is kata kunci mengesahkan bahawa kata kunci berjayaas. Dalam contoh ini, is kata kunci dan as huruf besar untuk menjadikannya lebih kelihatan.

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.

Kelas objek sebagai kes khas

Kelas Objek boleh muncul sebagai kes khas dalam fungsi pewarisan. Pengkompil memintas semakan jenis untuk tugasan ke dan daripada pembolehubah yang diisytiharkan sebagai jenis Objek. Sesetengah kelas mewarisi daripada kelas Objek , sesetengah kelas mewarisi daripada kelas lain dan sesetengah kelas tidak mewarisi daripada mana-mana kelas. Walaupun kelas Dialog tidak mewarisi daripada mana-mana kelas, pernyataan tugasan dan panggilan dalam contoh kod berikut berfungsi. Walau bagaimanapun, jika tugasan ialah bank4 = dlog3;, ia akan gagal pada masa penyusunan, kerana kelas Bank dan Dialog tidak mempunyai hubungan warisan antara satu sama lain. Pengkompil hanya melakukan satu pengesahan kecil pada tugasan kepada pembolehubah yang diisytiharkan sebagai kelas Objek . Pengkompil mengesahkan bahawa item yang ditugaskan kepada pembolehubah Objek ialah contoh kelas. Pengkompil tidak membenarkan tika penimbal jadual ditugaskan kepada pembolehubah Objek . Selain itu, pengkompil tidak membenarkan jenis data primitif, seperti int atau str, ditugaskan kepada pembolehubah Objek .

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.");
}

Jadual

Semua jadual mewarisi terus daripada jadual sistem Biasa, melainkan ia mewarisi secara eksplisit daripada jadual yang berbeza. Jadual Biasa tidak boleh disertakan. Ia tidak wujud dalam pangkalan data fizikal asas. Jadual Biasa mewarisi daripada kelas xRecord , tetapi dengan cara khas yang tidak sesuai untuk is kata kunci atau as kata kunci. Apabila as kata kunci digunakan untuk melakukan downcast tidak sah antara jadual, pembolehubah sasaran merujuk entiti bukan null yang tidak boleh digunakan. Sebarang percubaan untuk menyahrujukan pembolehubah sasaran akan menyebabkan ralat yang menghentikan program.

Kata kunci adalah dan sebagai dan jenis data lanjutan

Setiap jenis data lanjutan mempunyai sifat Extender . Gaya pewarisan yang dikawal oleh harta ini berbeza daripada gaya pewarisan yang is direka bentuk oleh kata kunci dan as kata kunci.

Pengendali hubungan

Jadual berikut menyenaraikan pengendali hubungan yang boleh digunakan dalam X++. Kebanyakan pengendali adalah binari dan mengambil dua operan. Walau bagaimanapun, pengendali not (!) adalah unary dan hanya mengambil satu operan. Sintaks untuk pengendali binari: expression1relationalOperatorexpression2 Sintaks untuk operator unary: relationalOperatorexpression1

Pengendali Description
like Pengendali hubungan seperti mengembalikanbenar jika ekspresi1 adalah seperti ekspresi2.
== Pengendali hubungan sama mengembalikan benar jika kedua-dua ungkapan adalah sama.
>= Lebih besar daripada atau sama dengan operator hubungan mengembalikan benar jika ekspresi1 lebih besar daripada atau sama dengan ungkapan2.
<= Kurang daripada atau sama dengan operator hubungan mengembalikan benar jika ungkapan1 kurang daripada atau sama dengan ungkapan2.
> Pengendali hubungan yang lebih besar daripada mengembalikan benar jika ekspresi1 lebih besar daripada ungkapan2.
< Pengendali hubungan kurang daripada mengembalikan benar jika ekspresi1 kurang daripada ekspresi2.
!= Pengendali hubungan tidak sama mengembalikan benar jika ekspresi1 berbeza daripada (iaitu, jika ia tidak sama dengan) ekspresi2.
&& Pengendali hubungan dan mengembalikan benar jika kedua-dua ekspresi1 dan ungkapan2 adalah benar.
|| Operator hubungan atau mengembalikan benar jika ekspresi1 atau ungkapan2 adalah benar, atau jika kedua-duanya benar.
! Pengendali hubungan bukan atau unary menafikan ungkapan. Ia mengembalikan benar jika ungkapan itu palsu dan palsu jika ungkapan itu benar.

Pengendali seperti

Pengendali like boleh digunakan * sebagai aksara kad bebas untuk sifar atau lebih aksara dan ? sebagai aksara kad bebas untuk satu aksara. Panjang maksimum operan ialah 1,000 aksara. Pengendali like dinilai oleh SQL asas, jadi hasilnya mungkin berbeza pada pemasangan yang berbeza. Jika ungkapan yang anda bandingkan mengandungi laluan fail, anda mesti menyertakan empat garis miring terbalik antara setiap elemen, seperti yang ditunjukkan dalam contoh berikut.

select * from xRefpaths
where xRefPaths.Path like "\\\\Classes\\\\AddressSelectForm"

Pengendali yang sama (==)

Apabila anda menggunakan operator yang sama (==) untuk membandingkan objek, rujukan objek dibandingkan, bukan objek itu sendiri. Tingkah laku ini mungkin menyebabkan isu jika anda membandingkan dua objek, satu daripadanya terletak pada pelayan dan satu lagi terletak pada klien. Dalam kes ini, anda harus menggunakan kaedah yang sama dalam kelas Objek . Anda boleh mengatasi kaedah ini untuk menentukan maksud untuk dua objek menjadi sama. Jika anda tidak mengatasi kaedah yang sama , perbandingan adalah sama dengan perbandingan yang dilakukan oleh pengendali yang sama (==).

Contoh kod untuk pengendali hubungan

"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.

Keutamaan pengendali

Susunan ungkapan majmuk dinilai boleh menjadi penting. Sebagai contoh, (x + y / 100) memberikan hasil yang berbeza, bergantung kepada sama ada penambahan atau pembahagian dilakukan terlebih dahulu. Anda boleh menggunakan kurungan (()) untuk memberitahu pengkompil secara eksplisit bagaimana ia harus menilai ungkapan. Sebagai contoh, anda boleh menentukan (x + y) / 100. Jika anda tidak memberitahu pengkompil secara eksplisit tertib yang anda mahu operasi dilakukan, tertib adalah berdasarkan keutamaan yang diperuntukkan kepada pengendali. Sebagai contoh, pengendali bahagian mempunyai keutamaan yang lebih tinggi daripada pengendali penambahan. Oleh itu, untuk ungkapan x + y / 100, pengkompil menilai y / 100 terlebih dahulu. Dalam erti kata lain, x + y / 100 adalah bersamaan dengan x + (y / 100). Untuk menjadikan kod anda mudah dibaca dan diselenggara, jelaskan. Gunakan kurungan untuk menunjukkan pengendali yang harus dinilai terlebih dahulu. Jadual berikut menyenaraikan pengendali mengikut urutan keutamaan. Semakin tinggi pengendali muncul dalam jadual, semakin tinggi keutamaannya. Pengendali yang mempunyai keutamaan yang lebih tinggi dinilai sebelum pengendali yang mempunyai keutamaan yang lebih rendah. Ambil perhatian bahawa keutamaan pengendali X++ tidak sama dengan keutamaan pengendali bahasa lain, seperti C# dan Java.

Kumpulan pengendali, mengikut urutan keutamaan Pengendali
Unary - ~ !
Pendaraban, peralihan, bitwise DAN, bitwise eksklusif ATAU * / % DIV << >> & ^
Tambahan, inklusif bitwise ATAU + - |
Hubungan, kesaksamaan < <= == != > >= like as is
Logik (DAN,OR) && ||
Bersyarat ? :

Pengendali pada talian yang sama mempunyai keutamaan yang sama. Jika ungkapan termasuk lebih daripada satu pengendali ini, ia dinilai dari kiri ke kanan, melainkan pengendali tugasan digunakan. (Pengendali tugasan dinilai dari kanan ke kiri.) Sebagai contoh, (logik&&) AND dan || (logikOR) mempunyai keutamaan yang sama, dan dinilai dari kiri ke kanan. Itu:

  • 0 && 0 || 1 adalah sama dengan 1
  • 1 || 0 && 0 adalah sama dengan 0.