Partekatu bidez


X++ eragileak

Oharra

Komunitatearen interes taldeak Yammer-etik Microsoft Viva Engage-ra mugitu dira. Viva Engage komunitate batean sartzeko eta azken eztabaidetan parte hartzeko, bete Eskatu Finantza eta Eragiketak Viva Engage komunitatearen sarbidea inprimakia eta aukeratu sartu nahi duzun komunitatean.

Artikulu honetan X++-n onartzen diren eragileak azaltzen dira.

Esleipen-eragileak

Esleipen batek aldagai edo eremu baten balioa aldatzen du. Ondorengo taulan X++ esleipen-eragileak agertzen dira. Ez desberdintasunik aurrizkiaren eta postaurrizkiaren eragileen artean.

Eragilea Azalpena
= Berdintasun zeinuaren eskuinaldean dagoen adierazpena ezkerreko aldagaiari esleitu behar dio.
+= Esleitu uneko aldagaiaren balioa gehi eskuineko adierazpena ezkerreko aldagaiari.
++ Aldagaia 1 gehitu behar da.
-= Esleitu uneko aldagaiaren balioa eskuineko adierazpena kenduta, ezkerreko aldagaiari.
-- Aldagaia 1 murriztu.

Esleipen-eragileen kode-adibideak

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

Eragile aritmetikoak

Eragile aritmetikoak erabiltzen dituzu zenbakizko kalkuluak egiteko. Eragile gehienak bitarrak dira eta bi eragile hartzen dituzte. Hala ere, not (~) eragilea unarioa da eta operando bakarra hartzen du. Eragile bitarren sintaxia: expression1ArithmeticOperatorexpression2 Eragile unarioen sintaxia: ArithmeticOperatorexpression1

Eragilea Azalpena
<< Ezkerreko desplazamendu-eragileakexpression2 ezkerreko desplazamendua (biderkatzea 2) egiten du expression1-en.
>> Eskuineko desplazamendu-eragileakexpression2 eskuineko desplazamendua (zatiketa 2) egiten du expression1-en.
* Biderket-eragileakadierazpena1 adierazpenarekin biderkatzen du2 adierazpenarekin.
/ Zatiketa eragileak adierazpena1adierazpenaren arabera zatitzen du.
DIV Osoko zatiketa eragileak 1 adierazpenaren zatiketa osoa egiten du2 adierazpenaren arabera.
MOD Osoko gainera-eragileak1adierazpenaren zatiketa osoaren gainerakoa itzultzen du2 adierazpenaren bidez.
~ Not eragileak edo eragile unarioak ez eragiketa bitarra egiten du.
& AND eragile bitarrak eta eragiketa bitarra egiten du expression1 eta expression2 gainean.
^ XOR eragile bitarrak XOR eragiketa bitarra egiten du expression1 eta expression2-n.
| OR eragile bitarrak edo eragiketa bitarra egiten du expression1 eta expression2 gainean.
+ Plus eragileak expression1 gehitzen dio expression2-ri.
- Minus eragileak expression2 adierazpenetikkentzen du.
? Eragile ternarioak hiru adierazpen hartzen ditu: adierazpena1 ? adierazpena2 : adierazpena3. 1 adierazpena egia bada, 2 adierazpena itzuliko da. Bestela, 3 adierazpena itzuliko da.

Eragile aritmetikoen kode-adibideak

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.

Adierazpen-eragileak

Eta asis adierazpen eragileak downcast eskariak kontrolatzen ditu. Beheranzko esleipenek klase edo taulen herentzia dakartza. Inplizituki behera egiten duten esleipen-adierazpenek aurreikusteko eta diagnostikatzeko zailak diren akatsak sor ditzakete. Gako-hitza as erabil dezakezu zure downcasts esplizituki egiteko. Gako-hitza is erabil dezakezu exekuzio-garaian downcast baliozkoa den ala ez egiaztatzeko.

Hitz gako-hitza

Erabili gako-hitza as oinarrizko klase-aldagai batetik klase eratorriko aldagai batera jaitsi egiten diren esleipenetarako. Gako-hitzak as beste programatzaile batzuei eta konpilatzaileari esaten die downcast baliozkoa izango dela exekuzio denboran.

  • Konpilatzaileak errore bat jakinarazten du gako-hitza as ez duten downcast esleipen-instrukzioetan.
  • Exekuzio-denboran, as gako-hitzak downcast esleipenaren instrukzioa esleitzea null eragiten du downcast baliozkoa ez bada.
  • Gako-hitz hau is askotan erabiltzen da gako-hitzak funtzionatuko duen ala ez as segurtasunez egiaztatzeko.

as gako-hitzaren kode-adibidea

Ondorengo kode-adibidean, DerivedClass klaseak BaseClass klasea hedatzen du. Kodearen adibideak baliozko bi esleipen ditu bere basec eta derivedc aldagaien artean. Upcast esleipenak basec-i ez du gako-hitza behar as , baina downcast esleipenak derivedc-ri gako-hitza as eskatzen du. Ondorengo kodea errorerik gabe konpilatu eta exekutatuko da.

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

Hitz gakoa da

Gako-hitzak is objektu bat zehaztutako klase bateko azpimota den egiaztatzen du. Adierazpenak isegiazkoa itzultzen du objektua klasearen azpimota bada edo objektua klasearen mota berekoa bada. Konpilatzaileak errore bat jakinarazten du gako-hitz adierazpen batek is bi mota konparatzen baditu, baina mota bat ere ez da bestearen azpimota bat, eta ez dira mota berekoak. Konpilatzaileak antzeko errore bat jakinarazten du bi motako esleipen-instrukzio arrunt batentzat, non mota bat ere ez baita bestearen azpimota eta ez dira mota berekoak. Exekuzio-garaian, azpiko objektuari erreferentzia egiten dion aldagai motak ez du garrantzirik is gako-hitzarekin. Gako-hitzak is sistemak aldagaiak erreferentzia egiten duen objektua egiaztatzen du, ez objektua erreferentzia egiten duen aldagaiaren adierazitako mota.

Is gako-hitzaren kode-adibideak

Ondorengo kode-adibideek adierazpen batek isegiazkoa edo faltsua itzultzen duen kontrolatzen duten baldintzak azaltzen dira. Kode-adibideak Form klaseak eta Query klaseak TreeNode klasea hedatzen dutela araberakoak dira.

// 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)));

Is eta as gako-hitzen kode-adibidea

Ondorengo kode-adibideak gako-hitzaren erabilera is tipikoa du. Gako-hitza as gako-hitzak arrakasta izango duela egiaztatu is ondoren as erabiltzen da. Adibide honetan, is eta gako-hitzak as maiuskulak dira, ikusgarriagoak izan daitezen.

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.

Objektu klasea kasu berezi gisa

Object klasea kasu berezi gisa ager daiteke herentzia funtzionalitatean. Konpilatzaileak Object motako aldagaietarako eta aldagaietarako esleipenen egiaztapena saihesten du. Klase batzuek Object klasetik heredatzen dute, klase batzuek beste klase batetik heredatzen dute eta klase batzuek ez dute inolako klaserik heredatzen. Dialog klaseak inolako klaseetatik heredatzen ez duen arren, ondorengo kode-adibideko esleipen- eta dei-instrukzioek funtzionatzen dute. Hala ere, esleipena hau bada, bank4 = dlog3;konpilazio-garaian huts egingo du, Bank eta Dialog klaseek ez baitute herentzia-erlaziorik elkarren artean. Konpilatzaileak baliozkotze txiki bakarra egiten du Object klaseko aldagai bati esleipenetan. Konpilatzaileak egiaztatzen du Object aldagaiari esleitzen zaion elementua klase baten instantzia dela. Konpilatzaileak ez dio onartzen taula buffer baten instantzia bat Object aldagaiari esleitzea. Gainera, konpilatzaileak ez du int aldagaiari esleitzeko datu mota primitiboak, hala nola str edo , esleitzea.

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

Taulak

Taula guztiak zuzenean Common System taulatik heredatzen dira, beste taula batetik esplizituki heredatzen ez badute. Taula komuna ezin da instantziatu. Ez azpiko datu-base fisikoan. Common taula xRecord klasetik heredatzen da, baina modu berezi batean, gako-hitzarentzat edo is gako-hitzarentzat egokia as ez dena. Gako-hitza taulen artean baliogabeko downcast bat egiteko erabiltzen denean as , helburuko aldagaiak nulua ez den entitate erabilgarri bati egiten dio erreferentzia. Helburuko aldagaia kentzeko saiakera bakoitzean errorea eragingo du programa geldiarazteko.

Hitz gako-hitzak eta datu mota hedatuak

Datu mota hedatu bakoitzak Extends propietatea du. Propietate honek kontrolatzen duen herentzia estiloa eta is gako-hitzak diseinatuta dauden herentzia as estilotik desberdina da.

Eragile erlazionalak

Ondorengo taulan X++-n erabil daitezkeen eragile erlazionalak agertzen dira. Eragile gehienak bitarrak dira eta bi eragile hartzen dituzte. Hala ere, not (!) eragilea unarioa da eta operando bakarra hartzen du. Eragile bitarren sintaxia: expression1relationalOperatorexpression2 Eragile unarioen sintaxia: relationalOperatorexpression1

Eragilea Azalpena
like Antzeko eragile erlazionalak egia itzultzen du adierazpena1 adierazpena2 bezalakoa bada.
== Eragile erlazional berdinakegia itzultzen du bi adierazpenak berdinak badira.
>= Eragile erlazionalaren handiagoa edo berdina den handiagoa edo berdinaden eragileak egia itzultzen du adierazpena1 adierazpena2 baino handiagoa edo berdina bada.
<= Eragile erlazionalaren txikiagoa edo berdina den eragileak egia itzultzen du adierazpena1 adierazpena2adierazpena baino txikiagoa edo berdina bada.
> Eragile erlazionalak baino handiagoa den egiazkoa itzultzen du adierazpena1 adierazpena2 baino handiagoa bada.
< Eragile erlazionalak egia itzultzen du adierazpena1 adierazpena2 baino txikiagoa bada.
!= Eragile erlazional ez berdinakegiazkoa itzultzen du adierazpena1 adierazpenetik desberdina bada (hau da, berdina ez bada).
&& eta eragile erlazionalak egia itzultzen du adierazpena1 eta adierazpena2 egiazkoak badira.
|| or eragile erlazionalak egia itzultzen du adierazpena1 edo adierazpena2 egia bada, edo biak egiazkoak badira.
! Eragile erlazionalak ezeztatu egiten du adierazpena. Egia itzultzen du adierazpena faltsua bada eta faltsua adierazpena egiazkoa bada.

Eragilearen antzekoa

Eragileak like komodinen karaktere gisa erabil * dezake zero karaktere edo gehiagorentzat, eta ? karaktere komodin gisa karaktere batentzat. Operandoaren gehienezko luzera 1.000 karakterekoa da. Eragilea like azpiko SQLaren arabera ebaluatzen da, beraz, emaitza desberdina izan daiteke instalazio desberdinetan. Konparatzen ari zaren adierazpenek fitxategi-bide-izen bat badute, elementu bakoitzaren artean lau alderantzizko barra sartu behar dituzu, ondorengo adibidean erakusten den bezala.

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

Eragile berdina (==)

Objektuak alderatzeko () == erabiltzen duzunean, objektuen erreferentziak konparatzen dira, ez objektuak berak. Portaera honek arazoak sor ditzake bi objektu konparatzen badituzu, horietako bat zerbitzarian eta bestea bezeroan. Kasu horietan, metodo berdina erabili beharko zenuke Object klasean. Metodo hau gainidatzi dezakezu bi objektu berdinak izateak zer esan nahi duen zehazteko. Metodo berdina gainidazten ez baduzu, konparazioa berdina (==) eragileak egiten duen konparazioaren berdina izango da.

Eragile erlazionalen kode-adibideak

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

Eragilearen lehentasuna

Adierazpen konposatu bat ebaluatzen den ordena garrantzitsua izan daiteke. Adibidez, (x + y / 100) emaitza desberdina ematen du, batuketa edo zatiketa lehenengo egiten den ala ez. Parentesi (()) erabil dezakezu konpilatzaileari adierazpen bat nola ebaluatu behar duen esplizituki esateko. Adibidez, zehaztu (x + y) / 100dezakezu. Konpilatzaileari ez badiozu esplizituki esaten eragiketak egin nahi dituzun ordenan, ordena eragileei esleitutako lehentasunean oinarrituko da. Adibidez, zatiketa eragileak batuketa eragilea baino lehentasun handiagoa du. Beraz, adierazpenari x + y / 100dagokionez, konpilatzaileak ebaluatzen du y / 100 lehenik. Hau da, x + y / 100 baliokidea x + (y / 100)da. Zure kodea erraz irakurtzeko eta mantentzeko, izan esplizitu. Erabili parentesi artean zein eragile ebaluatu behar diren lehenengo adierazteko. Ondorengo taulan eragileak agertzen dira lehentasun-ordenan. Zenbat eta altuagoa izan eragile bat taulan, orduan eta handiagoa izango da bere lehentasuna. Lehentasun handiagoa duten eragileak lehentasun txikiagoa duten eragileen aurretik ebaluatzen dira. Kontuan izan X++-ren eragilearen lehentasuna ez dela beste lengoaia batzuen lehentasun eragilearen berdina, hala nola C# eta Java.

Eragile-taldeak, lehentasun-ordenaren arabera Eragileak
Unarioa - ~ !
Biderkatzailea, desplazamendua, bit batetik bestera AND, bit batetik bestera OR esklusiboa * / % DIV << >> & ^
Gehigarria, bit batetik bestera inklusiboa OR + - |
Berdintasuna, berdintasuna < <= == != > >= like as is
Logikoa (AND,OR) && ||
Baldintzatua ? :

Lerro bereko eragileek lehentasun berdina dute. Adierazpen batek eragile horietako bat baino gehiago baditu, ezkerretik eskuinera ebaluatuko da, esleipen-eragileak erabiltzen ez badira. (Esleipen-eragileak eskuinetik ezkerrera ebaluatzen dira.) Adibidez, && (logikoa AND) eta || (logikoa OR) lehentasun bera dute, eta ezkerretik eskuinera ebaluatzen dira. Beraz:

  • 0 && 0 || 1 honen berdina da 1
  • 1 || 0 && 0 berdina 0da.