メモ
コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。
この記事では、X++ でクラスおよびメソッドを作成および使用する方法について説明します。 クラスとメソッドのセマンティクスと構文のほとんどは、Java や C# などの他のプログラミング言語のセマンティクスに似ています。 X++ のクラスとメソッドは、マネージド ランタイムのクラスとメソッドに密接にマップされます。 実際には、X++ から .NET クラスを直接使用できます。
クラスは、後でその クラス から構築するインスタンスのデータとメソッドを定義します。 クラス は、問題のあるドメイン内の オブジェクト を抽象化したものです。 クラスから構築できるインスタンスは、インスタンスまたはオブジェクトと呼ばれます。 この記事では、インスタンスという用語を使用します。 データはオブジェクトの状態を表し、メソッドはオブジェクトの動作を表します。
フィールド にはクラスのデータが含まれます。 クラス宣言から構築するすべてのインスタンスには、フィールドの独自のコピーがあります。 これらのフィールドは 、インスタンス フィールドと呼ばれます。 この記事では、ほとんどの場合、フィールド という用語を使用します。
メソッド は、クラスの動作を定義します。 データを操作するステートメントが含まれています。 既定では、クラスのインスタンス フィールドを操作するメソッドを宣言します。 これらのメソッドは、instance メソッドまたは object メソッドと呼ばれます。
インスタンス フィールド にアクセスできない 静的メソッド および 静的フィールド を宣言できます。 詳細については、X++ 静的クラス を参照してください。
クラスを宣言します
Visual Studio の [新しい項目の追加] ダイアログを使用して、プロジェクトにクラスを追加します。
- サーバー エクスプローラーで、プロジェクトを右クリックしてから追加をクリックします。
- 新しい項目 のダイアログ ボックスの左側のナビゲーションで、インストール済み > Dynamics 365 の項目 > コード の順に選択します。 クラス を選択し、クラス名を入力します。
- 追加 をクリックします。
既定では、すべてのクラスが公開されます。 パブリック モディファイアーを削除すると、システムではクラスはパブリック クラスとして扱われます。 クラス宣言では、final、internal、static、abstract などの、他の修飾子を指定することができます。
フィールド
インスタンス フィールドは既定で保護されています。 この既定の設定は、同じクラスまたは 派生クラス内でのみこれらのフィールドにアクセスできることを意味します。 プライベート キーワード、保護キーワード、またはパブリック キーワードを使用して、インスタンス フィールドのアクセス レベルを変更します。
メモ
メンバー フィールドをパブリックにすることは、クラスの内部動作をコンシューマーに公開するため、良い考えではありません。 この公開により、クラス実装とそのコンシューマーとの間に強い依存関係が生まれます。 常に、実装ではなくコントラクトのみに依存するように努めます。
フィールド自体の宣言などと共に、フィールド インラインに値を割り当てることができます。 この割り当ては、静的フィールドとインスタンス フィールドの両方に適用されます。 このクラスは、これらの値 (インスタンス クラスの場合) を初期化するか、静的コンストラクター (typeNew) によって呼び出されます。
次の例は、アクセサー メソッドを使用してフィールド データを公開する方法を示しています。 フィールド firstName は保護されているため、この例では、アクセサー (get および set) メソッドを実装して、保護されたフィールドへのアクセスを許可します。 フィールド lastName はパブリックであるため、コードはフィールドの値を取得して設定できます。
// This is the class definition.
public class HasAFirstName
{
str firstName = ""; // protected by default
public str lastName = "";
public str getFirstName()
{
return firstName;
}
public void setFirstName(str newName)
{
firstName = newName;
}
}
// This code creates an instance of the class and gets the fields.
public static void TestLastName()
{
HasAFirstName hasFirstName = new HasAFirstName();
hasFirstName.setFirstName("Dion");
info(hasFirstName.getFirstName());
hasFirstName.lastName = ("Townes");
info(hasFirstName.lastName);
}
// The output is "Dion" and "Townes".
フィールド属性
属性がクラスおよびメソッドを修飾できるのと同じ方法で、フィールドを属性で修飾できます。 次の例では、MyField フィールドを MyAtribute 属性で修飾します。
class MyClass
{
[MyAttribute]
public int myField;
}
有用な属性は、SysObsolete 属性です。 SysObsolete 属性をフィールドに適用すると、コンパイラはフィールドへの参照に対してエラーまたは警告を生成します。 警告かエラーかは、次のコードに示すように、属性の 2 番目のパラメーターによって異なります。
class MyClass
{
// Generate an error (because the second attribute parameter is true)
// if the field is referenced.
[SysObsolete("This field is obsolete.", true)]
public int myField;
}
コンストラクター
クラスのインスタンスを作成するには、インスタンス化する必要があります。 新しいキーワードを使用してクラスをインスタンス化します。 新しい式が評価されると、その状態のヒープにメモリが割り当てられ、コンストラクターが呼び出されます。
- クラスでは、新しい メソッド (コンストラクター) を 1 つだけ定義できます。
- コンストラクターを定義しない場合、コンパイラはパラメーターのない既定のコンストラクターを自動的に作成します。
- 既定のコンストラクターは、新しい メソッドでパラメーターに既定値を割り当てることによってシミュレーションできます。
次の例では、Point クラスのパラメーターのないコンストラクターを定義します。
class Point
{
// Public instance fields. In practice, you should make these protected or private
// and create accessor methods.
public real x = 0.0;
public real y = 0.0;
void new()
{
}
}
クリーンな継承モデルを作成し、コードをアップグレードするときの問題を最小限に抑えるには、次の手順に従います。
- 抽象クラスでない場合、各クラスは単一のパブリック構築メソッドを持つ必要があります。
- 各クラスには、少なくとも 1 つの静的コンストラクト メソッドが必要です。
- 各クラスに newメソッド (コンストラクター) が必要です。 このメソッドは保護する必要があります。
- クラス フィールドを取得および設定するアクセサー メソッドを作成します。
- インスタンス化の後に特殊な初期化タスクを実行するための init メソッドを作成します。
オブジェクトのインスタンスを作成する
コンストラクター、新規は、クラスの新しいインスタンスを返します。 次のコード例は、ポイント クラスのインスタンスを 2 つ作成する方法を示しています。
// Declare a field to refer to a Point instance.
Point myPoint; // the default value is null.
// Create an instance of the Point class.
myPoint = new Point();
デストラクター
インスタンスは、インスタンスに関する参照がない場合は自動的に破棄されます。
ファイナライズ メソッドを使用する
オブジェクトの状態を明示的にクリーンアップするには finalize メソッドを使用します。 このメソッドは規則であるため、特別なセマンティクスはありません。 マネージド ランタイムは、オブジェクトを破棄するときに finalize メソッドを暗黙的に呼び出しません。 明示的にクリーンアップを行うためには、メソッドを呼び出す必要があります。 ほとんどの場合、最終的な方法を指定する必要はありません。
参照変数を Null に設定する
参照変数を Null に設定してオブジェクトを終了します。 この方法を使用すると、他の変数がそのオブジェクトをポイントしていない場合にのみオブジェクトが破棄されます。 他のコードが変数を使用していないことを確認する必要があります。 次の例では、参照変数を作成し、null に設定します。
Point myPoint = new Point();
myPoint = null;
メソッド
インスタンス メソッド
クラスのインスタンスを使用してインスタンス メソッドを呼び出すので、メソッドを使用する前にオブジェクトをインスタンス化する必要があります。 次のコードは、インスタンス メソッドを定義して、それをインスタンスから呼び出す方法を示しています。
class Square
{
private int side = 0;
public void new(int _side = 1)
{
side = _side;
}
public int getArea()
{
return side * side;
}
}
// This code creates an instance of Square and calls getArea.
Square square = new Square(15);
int area = square.getArea();
info(int2Str(area));
// Output is "225".
静的メソッド
静的メソッドは、クラス メソッド とも呼ばれ、クラスに属し、static キーワードを使用して定義されます。 静的メソッドを使用する前に、オブジェクトのインスタンスを作成する必要はありません。 静的メソッドは、クラスの静的フィールドの値にアクセスし、静的メソッドを呼び出すことができます。
静的メソッドを呼び出すには、次の構文を使用します。
ClassName::methodName();
主要メソッド
main メソッドは、メニュー オプションから直接実行できるクラス メソッドです。 _args パラメーターを使用して、メソッドにデータを転送できます。
static void main (Args _args)
{
// Your code here.
}
メソッドの宣言
メソッドの宣言は、ヘッダーと本文で構成されます。 メソッド ヘッダーは、メソッドの名前と戻り値の型、メソッド モディファイアー、およびパラメーターを宣言します。 (戻り値の型が 無効 である可能性があります。) メソッド本体は、変数宣言、ローカル関数宣言、およびステートメントで構成されます。
戻り値の型
各メソッドには戻り値の型が必要です。 メソッドが何も返さない場合、無効キーワードを戻り値の型として使用します。
次の例は、2 つのメソッドを示しています。 一方のメソッドには戻り値の型があり、もう一方の方法には戻り値の型がありません。
void methodWithNoReturnValue()
{
// Your code here.
// ...
// The return statement can be provided without parameters
return;
// There's an implicit return when the method flow reaches the end.
}
// If a method returns something, you must specify the return type and include a return statement.
int methodNameIntegerReturnValue()
{
return 1;
}
構文
メソッド宣言 = 見出し 本文 見出し = [モディファイアー] 戻り値の型 MethodName ( パラメーター リスト)
モディファイアー = [編集 | 表示 ] [ public | protected | private ] [static | abstract | final ]
ReturnType = Datatype| void*
MethodName = 識別子
パラメーター リスト = [パラメーター{ 、パラメーター}]
パラメーター = データ型 変数識別子 [ =式]
本文 = { Statement }
ステートメント = VariableDeclarationStatement | EmbeddedFunctionDeclarationStatement | ...
埋め込み関数用の宣言 = 見出し{[変数宣言] [明細書]}
戻り値の型を設定していないメソッドの例
void update ()
{
// Field declared and initialized
CustTable this_Orig = this.orig();
// First statement in body (begin transaction)
ttsBegin;
this.setNameAlias();
// Calls super's implementation of update
super();
this.setAccountOnVend(this_Orig);
if (this_Orig.custGroup != this.custGroup)
ForecastSales::setCustGroupId(
this.accountNum,
this_Orig.custGroup,
this.custGroup);
// Commits transaction
ttsCommit;
}
パラメーターを持つメソッドの例
次の例では、checkAccountBlocked メソッドはブール値を返し、amountCur パラメーターで動作します。
boolean checkAccountBlocked(AmountCur amountCur)
{
if (this.blocked == CustVendorBlocked::All
|| (this.blocked == CustVendorBlocked::Invoice && amountCur > 0 ))
{
return checkFailed(strFmt("@SYS7987",this.accountNum));
}
return true;
}
メソッド修飾子
メソッド宣言に複数の修飾子を適用します。 最終的な静的な修飾子など、一部の修飾子を組み合わせることができます。 メソッド モディファイア キーワードを次に示します。
- abstract - メソッドを宣言しますが、実装しないでください。 サブクラスはメソッドをオーバーライドする必要があります。 親クラスに属する 1 つ以上の抽象メソッドがオーバーライドされないサブクラスからオブジェクトを作成しようとすると、コンパイラ エラーが発生します。 抽象クラスでのみ抽象メソッドを定義します。
クラスは抽象クラスにすることもできます。 場合によっては、抽象概念を表すため、クラスをインスタンス化しないでください。 サブクラスのみインスタンスを作成する必要があります。 この型の基底クラスを抽象として宣言 します。 たとえば、勘定の概念をモデル化します。 実際の世界には派生クラス (普通預金口座など) のみ存在するため、アカウントは抽象エンティティです。 この例では、アカウント クラスを 抽象 として宣言し、CheckingAccount、SavingsAccount などの派生クラスを持つ必要がある明確なケースについて説明します。
- display - メソッドの戻り値がページまたはレポートに表示されます。 ページまたはレポートで値を変更することはできません。 通常、戻り値は合計などの計算された値です。
- edit - メソッドの戻り値の型は、ページで使用されるフィールドの情報を提供します。 このフィールドの値は修正できます。
- 最終 - メソッドはそのクラスから派生したクラスで上書きすることはできません。
- public - クラスにアクセスできる任意の場所で パブリック メソッドにアクセスします。 サブクラスはこれらのメソッドをオーバーライドできます。 アクセス修飾子のないメソッドは暗黙的にパブリックとなります。
- protected - メソッドが宣言されている クラスを拡張するクラスおよびサブクラス内のメソッドからのみ、保護されたメソッドを呼び出します。
- private - プライベート メソッドが宣言されているクラス内のメソッドからのみプライベート メソッドを呼び出します。
- internal - メソッドが定義されているクラスと同じモデルで定義されているクラス内のメソッドからのみ 内部 メソッドを呼び出します。
- 静的 - メソッドはクラス メソッドです。 静的メソッドは、インスタンス フィールドを参照できません。 それらはクラスのインスタンスでは呼び出されません。 代わりに、クラス名を使用して呼び出されます (例: MyClass::aStaticProcedure())。
モディファイアーのあるメソッド
次の例は、メソッド ヘッダーのみを示しています。
// A method that can't be overridden
final int dontAlterMe()
// A static method
static void noChange()
// A display method that returns an integer
display int value()
メソッド アクセス制御
アクセサーキーワードpublic、protected、およびprivateを使用して、他のクラスのメソッドがあなたのクラスのメソッドを呼び出すことができるかどうかを制御します。 メソッドのアクセス キーワードは、クラス継承のルールとも連携します。
メソッドで使用するアクセサー キーワードは次のとおりです。
- public - public として宣言するメソッドは、クラスにアクセスできる任意の場所から呼び出すことができます。 さらに、メソッドを final として宣言しない限り、パブリック メソッドはサブクラスによってオーバーライドできます。
-
protected - protected として宣言するメソッドは、次のメソッドからのみ呼び出すことができます。
- クラスのメソッド。
- 保護されたメソッドを含むクラスのサブクラス内のメソッド。 サブクラス内の保護されたメソッドをオーバーライドできます。
- private - プライベートとして宣言するメソッドは、 プライベート メソッドを宣言するクラス内のメソッドからのみ呼び出すことができます。 サブクラス内のプライベート メソッドをオーバーライドすることはできません。 コードのメンテナンスを容易にするには、実装の詳細をプライベート メソッドとして非表示にします。
静的およびインスタンス メソッド
メソッドのアクセサー キーワードは、どのメソッドが静的であるか、静的でないかに関係なく、同じクラスにある 2 つのメソッド間の呼び出しを制限することはありません。 静的メソッドでは、新しいコンストラクター メソッドがプライベート モディファイアーで修飾されている場合でも、新しいコンストラクター メソッドに対する呼び出しは有効です。 これらの呼び出しの構文では、 new キーワードを使用する必要があります。 静的メソッドのコードは、クラスのインスタンス メソッドを呼び出す前に、独自のクラスのインスタンス オブジェクトを構築する必要があります。
オーバーライド時のアクセスを増やすこと
サブクラス内のメソッドをオーバーライドする場合、オーバーライドするメソッドは、少なくともオーバーライドされたメソッドと同じくらいアクセス可能である必要があります。 たとえば、次のコンパイラ ルールは、サブクラスで保護されたメソッドが上書きされる時に適用されます。
- スーパークラスのパブリック メソッドは、サブクラス内のパブリック メソッドでのみオーバーライドできます。
- サブクラスでは、パブリック メソッドまたは保護対象のメソッドはスーパークラスの保護対象のメソッドをオーバーライドできません。
- サブクラスでは、プライベート メソッドはスーパークラスの保護対象のメソッドをオーバーライドできません。
オプションのパラメーター
メソッド宣言パラメーター リストでパラメーターを初期化できます。 この場合、パラメーターはオプションのパラメーターとなります。 メソッド呼び出しで値を指定しない場合は、既定値が使用されます。 最初の省略可能なパラメーターの前に、必要なすべてのパラメーターを一覧表示します。 次の例では、オプションのパラメーターを持つメソッドを作成して呼び出す方法を示しています。
オプション パラメーターの例
次のコード例は、既定のパラメーターを持つメソッドを示しています。
class Person
{
date birthDate;
// The constructor that takes a date type as a parameter.
// That value is assigned to the field member birthDate.
void new(date _date)
{
birthDate = _date;
}
// The CalculateAgeAsOfDate method references the birthDate field and has an
// optional parameter.
public real CalculateAgeAsOfDate(
date _calcToDate = DateTimeUtil::getToday(DateTimeUtil::getUserPreferredTimeZone()))
{
return (_calcToDate - birthDate) / 365;
}
public static void callPerson()
{
var person = new Person(13\5\2010);
// Optional parameter's default is used.
Info(strFmt('Age in years today is %1 years',
real2int(person.calculateAgeAsOfDate())));
// January 2, 2044 is the parameter value for _date.
Info(strFmt('Age in years on %1 is %2 years',
2\1\2044,
real2int(person.calculateAgeAsOfDate(2\1\2044))));
}
}
この例では、2 番目の省略可能なパラメーターにスキップできない方法を示します。 addThreeIntsメソッドには 2 つのオプション パラメーターがあります。 callAdditions メソッドは、AddThreeInts メソッドを呼び出します。 コメント アウトされたコードは、_i3 パラメーター (_i2 ではなく) にのみ値を提供しますが、コンパイラでは、前のすべての必須とオプションのパラメーターも呼び出しで指定する必要があります。
class Additions
{
public static int addThreeInts(int _i1, int _i2 = 2,int _i3 = 3)
{
return _i1 + _i2 + _i3;
}
public static void callAdditions()
{
// The next statement doesn't compile, because it skips the _i2 parameter.
// info(int2Str(Additions::AddThreeInts(1, , 99)));
// These are legal
info(int2Str(Additions::AddThreeInts(1, 2)));
info(int2Str(Additions::AddThreeInts(1, 2, 99)));
}
}
アクセサー メソッド
クラス フィールドは既定で保護されています。 クラスの内部実装の詳細を非表示にすることで、そのクラスを使用するコードを破棄することなくクラスの実装を後で変更することができます。 外部から参照フィールドのデータにアクセスするには、アクセサー メソッドを作成する必要があります。 次の例では、アクセス メソッドを使用してフィールド x および y にアクセスする Point クラスを定義します。
class Point
{
// Instance fields
real x;
real y;
void new(real _x = 10, real _y = 10)
{
x = _x;
y = _y;
}
// Accessor methods
void setX(real _x)
{
x = _x;
}
void setY(real _y)
{
y = _y;
}
real getX()
{
return x;
}
real getY()
{
return y;
}
}
これらのメソッド宣言は、Point クラスが外部からのフィールドへのアクセスを提供する方法を示しています。 その他のオブジェクトは、アクセサー メソッドを使ってインスタンス フィールド Point オブジェクトを操作できます。
Point myPoint = new Point();
// Set the x fields using the accessor method.
myPoint.setX(4.0);
// Get the x fields using the accessor method.
info(any2Str(myPoint.getX()));
プライベート フィールドに対してアクセサーを実装する他の方法があります。 次のメソッドを考慮してください:
public int parmX(int _x = x)
{
x = _x;
return x;
}
prmIsDefault 定義済み関数を使用して、メソッドが呼び出された際にパラメーターが指定されたかどうかを実行時に判断する別の方法もあります。
public int parmX(int _x = x)
{
if (!prmIsDefault(_x))
{
// This is the setter. Do something with the incoming value...
x = _x + 2;
}
return x;
}
どちらの場合も、parm メソッドはフィールドを設定するパラメーターで、またはそれを返すパラメーターなしで呼び出すことができます。 この方法では、2 つではなく 1 つのアクセサーメソッドのみがあります。 いずれにしても、名前付け規則を使用してこれらのメソッドを識別し、それらを "parm" 接頭語で名前付けします。
パラメーター
すべてのメソッドは、独自の スコープ を定義します。 メソッドのスコープ内では、パラメーターはローカル変数として扱われ、メソッド呼び出しの式からの値で初期化されます。 すべてのパラメーターは値渡しされます。 呼び出しで変数をパラメーター値として使用する場合、その変数にはパラメーターに加えられた変更は反映されません。
メソッドでの変数の範囲
スコープは、アイテムにアクセスできる領域を定義します。 メソッドは、クラスで定義した変数にアクセスできます。 現在のブロック内のメソッド内の変数にのみアクセスできます。 複合ステートメントとローカル関数宣言は、独自の入れ子になったスコープを確立します。
ローカル関数
メソッド内部のローカル関数を宣言することができます。 これらの関数はローカル関数と呼ばれます。
- メソッドでは、任意の数のローカル関数を宣言できます。
- ローカル関数内のコードは、ローカル関数を含むメソッドで以前に宣言された変数にアクセスできます。
- ローカル関数の外部のコードは、ローカル関数で宣言されている変数にアクセスできません。
- ローカル関数が宣言されているメソッド内のコードのみがローカル関数を呼び出すことができます。
次の例は、2 つのローカル関数である localFunctionA および localFunctionB の有効な宣言を示しています。 ローカル関数への呼び出しは、必要に応じて、関数宣言の後に行われます。
static void StaticFunction()
{
int number = 654;
void localFunctionA(int _iNum) // The local function.
{
str innerString = "String in localFunctionA";
str output = strFmt("localFunctionA: %1 , %2 , %3", _iNum, innerString, number);
info(output);
}
int outer = 42;
void localFunctionB()
{
info("Printing from inside localFunctionB. " + int2str(outer));
}
localFunctionA(55);
localFunctionB();
// Next info statement would fail to compile,
// because innerString is restricted to the
// scope of the local function in which it is declared.
// print innerString;
}
// When called, the output is:
// localFunctionA: 55 , String in localFunctionA , 654
// Printing from inside localFunctionB. 42
拡張メソッド
拡張メソッド機能を使用すると、メソッドを別の拡張クラスに記述することによって、拡張メソッドを対象クラスに追加できます。 ユーザーの観点からは、拡張メソッドが拡張メソッドに書き込まれたかのように見えるのです。 次のルールが適用されます。
- 拡張クラスは静的でなければなりません。
- 拡張クラスの名前は、10 文字の接尾語 _Extension で終了する必要があります。 ただし、接尾辞に先行する名前の部分には制限はありません。
- 拡張子クラス内のすべての拡張子メソッドは、パブリック静的として宣言する必要があります。
- すべての拡張メソッドの最初のパラメーターは、拡張メソッドが拡張する型です。 ただし、拡張メソッドが呼び出されると、呼び出し元は最初のパラメーターに対して何も渡す必要がありません。 代わりに、システムが最初のパラメーターに必要なオブジェクトを自動的に渡します。
拡張クラスにプライベートまたは保護された静的メソッドを含めることは完全に有効です。 通常、これらのメソッドは実装の詳細を処理し、拡張機能として公開されません。 次の例は、いくつかの拡張メソッドを保持する拡張クラスを示しています。
public static class AtlInventLocation_Extension
{
// This method is available on the InventLocation type.
public static InventLocation refillEnabled(
InventLocation _warehouse,
boolean _isRefillEnabled = true)
{
_warehouse.ReqRefill = _isRefillEnabled;
return _warehouse;
}
public static InventLocation save(InventLocation _warehouse)
{
_warehouse.write();
return _warehouse;
}
}
拡張メソッドを使用する理由
拡張メソッドの手法は、拡張するクラスのソース コードには影響しません。 ターゲット クラスへのアップグレードは、既存の拡張メソッドには影響しません。 ただし、ターゲット クラスへのアップグレードで拡張メソッドとして同じ名前のメソッドが追加される場合、拡張メソッドはターゲット クラスのオブジェクトを通して到達できなくなります。 拡張メソッドは使いやすいです。 拡張メソッドの手法では、通常のインスタンス メソッドを呼び出すために定期的に使用するのと同じドット区切りの構文が使用されます。 拡張メソッドは、ターゲット クラスのすべてのパブリック コンポーネントにアクセスできますが、保護されたまたはプライベートのオブジェクトにはアクセスできません。
拡張メソッドを適用できる場所
拡張メソッドのターゲットは、次のアプリケーション オブジェクト タイプのいずれかである必要があります。
- クラス
- テーブル
- 表示
- マップ
ターゲットの型に関係なく、拡張 クラス を使用して拡張メソッドを型に追加します。 たとえば、拡張テーブルを使用してテーブルにメソッドを追加したり、拡張テーブルなどはありません。
このキーワード
このキーワードは、このキーワードを使用するクラスまたはテーブルのインスタンスへの参照です。 この参照は、インスタンス メソッドの呼び出し (呼び出されたメソッドがクラス内のクラスまたはそのスーパークラスにある場合) に必要ですが、コードを明確にし、コード エディターでの IntelliSense の動作を強化できます。 すべての呼び出しインスタンス メソッドはこれを参照または変数のいずれかにより修飾される必要があります。 この参照を使用して、次の情報を修飾できます。
-
この参照を使用するのと同じクラス内の他のインスタンス (非静的) メソッドの名前。 次に例を示します:
boolColorChanged = this.colorItOrange(); - このオブジェクトが継承するメソッドの名前。
- このキーワードを使用するメソッドを含むテーブル上のフィールドの名前。
この参照は、次の方法では使用できません。
- classDeclaration コードで宣言されているメンバー変数の名前を限定することはできません。
- 静的メソッドで使用できません。
- クラスやテーブルの静的メソッドの名前を限定することはできません。
入れ子になったクラス
X++ ソース コードでクラスを入れ子にすることができます。 入れ子になったクラスは、フォーム内 (つまり、FormRun を拡張するクラス) 内でのみ使用して、コントロール、データ ソース、またはデータ フィールドを表すことができます。
職務
X++ メソッドをすばやく簡単に実行するには、 static Main(xArgs args) メソッドをクラスに追加します。 Microsoft Visual Studio でプロジェクトのスタートアップ オブジェクト フォームとしてクラスを設定します。 プロジェクトを実行すると、 Main メソッドが実行されます。