この記事では、X++ でクラスおよびメソッドを作成および使用する方法について説明します。 クラスとメソッドのセマンティクスや構文の多くが、Java や C# などの他のプログラミング言語のセマンティクスに似ています。 X++ のクラスとメソッドは、マネージド ランタイムのクラスとメソッドに密接にマップされます。 実際、.NETのクラスはX++から直接使用できます。
クラス は、そのクラスから後に構築されるインスタンスのデータおよびメソッドを定義します。 クラス は、問題のあるドメイン内の オブジェクト を抽象化したものです。 クラス から構築できるインスタンスは、インスタンス または オブジェクト と呼ばれます。 この記事では、インスタンスという用語を使用します。 データはオブジェクトの状態を表し、メソッドはオブジェクトの動作を表します。
フィールド にはクラスのデータが含まれます。 クラス宣言から構築されたすべてのインスタンスには、フィールドの独自のコピーがあります。 これらは インスタンス フィールド と呼ばれます。 この記事では、ほとんどの場合、フィールド という用語を使用します。
メソッド は、クラスの動作を定義します。 データを操作するステートメントが含まれています。 既定では、メソッドはクラスのインスタンス フィールドを操作するように宣言されます。 これらのメソッドは、instance メソッドまたは object メソッドと呼ばれます。
インスタンス フィールド にアクセスできない 静的メソッド および 静的フィールド を宣言できます。 詳細については、X++ 静的クラス を参照してください。
クラスを宣言します
プロジェクトにクラスを追加するには、Visual Studio で 新しい項目の追加 ダイアログを使用する必要があります。
- サーバー エクスプローラーで、プロジェクトを右クリックしてから追加をクリックします。
- 新しい項目 のダイアログ ボックスの左側のナビゲーションで、インストール済み > Dynamics 365 の項目 > コード の順に選択します。 クラス を選択し、クラス名を入力します。
- 追加 をクリックします。
既定では、すべてのクラスが公開されます。 パブリック モディファイアーを削除すると、システムではクラスはパブリック クラスとして扱われます。 クラス宣言では、final、internal、static、abstract などの、他の修飾子を指定することができます。
フィールド
インスタンス フィールドは既定で保護されています。 これは、同じクラスまたは 派生クラス の中でしかアクセスできないことを意味します。 private、protected、または public キーワードを使用して、インスタンス フィールド宣言を変更できます。
メモ
メンバー フィールドを公開することは、クラスの内部動作をそのコンシューマーに公開し、クラスの実装とそのコンシューマー間に強い依存関係を作成するため、あまり推奨されていません。 常に、実装ではなくコントラクトにのみ依存させる必要があります。
フィールド自体の宣言などと共に、フィールド インラインに値を割り当てることができます。 これは、静的フィールドとインスタンス フィールドの両方に適用されます。 これらの値は、クラスが初期化される (インスタンス クラスの場合)、または静的コンストラクター (typeNew) が呼び出される際に割り当てられます。
次の例は、アクセサー メソッドを使用してフィールド データを公開する方法を示しています。 フィールド firstName は保護されているため、保護されたフィールドへのアクセスを可能にするために、アクセサー (取得および設定) メソッドが実装されます。 フィールド 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;
}
コンストラクター
クラスのインスタンスを作成するには、インスタンス化する必要があります。 クラスは、new キーワードを使用してインスタンス化されます new 式が評価されると、その状態のヒープにメモリが割り当てられ、構造 が呼び出されます。
- クラスでは、新しい メソッド (コンストラクター) を 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 ( パラメーター リスト)
モディファイアー = [edit | display ] [ 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;
}
メソッド modifiers
いくつかのモディファイアーは、メソッドの宣言に適用することができます。 一部の修飾子を結合できます (たとえば、final static)。 メソッド モディファイア キーワードを次に示します。
- 抽象 - メソッドは宣言されていますが、実装されていません。 このメソッドはすべてのサブクラスで上書きする必要があります。 サブクラスに親クラスに属する 1 つ以上の抽象メソッドがあり、オーバーライドされていません。そのサブクラスからオブジェクトを作成しようとすると、コンパイラ エラーが発生します。 抽象メソッドは、抽象クラスでのみ定義できます。
クラスは抽象クラスにすることもできます。 場合によっては、抽象概念を表すため、クラスをインスタンス化しないでください。 サブクラスのみインスタンスを作成する必要があります。 このタイプの基本クラスは抽象として宣言できます。 たとえば、勘定の概念をモデル化します。 実際の世界には派生クラス (普通預金口座など) のみ存在するため、アカウントは抽象エンティティです。 この例では、アカウント クラスを 抽象 として宣言し、CheckingAccount、SavingsAccount などの派生クラスを持つ必要がある明確なケースについて説明します。
- ディスプレイ - メソッドの戻り値は、ページまたはレポートに表示される必要があります。 ページまたはレポートで値を変更することはできません。 通常、戻り値は合計などの計算された値です。
- 編集 - ページで使用されるフィールドの情報を提供するために使用されるメソッドの戻り値の型。 このフィールドの値は修正できます。
- 最終 - メソッドはそのクラスから派生したクラスで上書きすることはできません。
- パブリック: パブリック として宣言されるメソッドは、クラスがアクセスできるどの場所にもアクセスでき、サブクラスによって上書きすることができます。 アクセス修飾子のないメソッドは暗黙的にパブリックとなります。
- 保護 - 保護 として宣言されるメソッドは、クラス、およびメソッドが宣言されているクラスを拡張するサブクラスのメソッドからのみ呼び出すことができます。
- プライベート - プライベート として宣言されるメソッドは、プライベート メソッドが宣言されているクラスのメソッドからのみ呼び出すことができます。
- 内部 - 内部 として宣言されるメソッドは、メソッドが定義されているクラスと同じモデルで定義されているクラスのメソッドからのみ呼び出すことができます。
- 静的 - メソッドはクラス メソッドです。 静的メソッドは、インスタンス フィールドを参照できません。 クラスのインスタンスでは呼び出されません。 代わりに、クラス名を使用して呼び出されます (例: 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 として宣言されるメソッドは、クラスがアクセスできるどの場所からでも呼び出すことができます。 さらに、メソッドが最終として宣言されていない限り、パブリック メソッドをサブクラスでオーバーライドできます。
-
protected: protected として宣言されるメソッドは、次のメソッドからのみ呼び出すことができます:
- クラスのメソッド。
- 保護されたメソッドを含むクラスのサブクラス内のメソッド。 保護されているメソッドは、サブクラスで上書きできます。
- プライベート - プライベート として宣言されるメソッドは、プライベート メソッドが宣言されているクラスのメソッドからのみ呼び出すことができます。 サブクラスでプライベート メソッドをオーバーライドできません。 実装の詳細はプライベート メソッドとして非表示にし、コードのメンテナンスを容易にする必要があります。
静的およびインスタンス メソッド
メソッドのアクセサー キーワードは、どのメソッドが静的であるか、静的でないかに関係なく、同じクラスにある 2 つのメソッド間の呼び出しを制限することはありません。 静的メソッドでは、新しいコンストラクター メソッドがプライベート モディファイアーで修飾されている場合でも、新しいコンストラクター メソッドに対する呼び出しは有効です。 これらの呼び出しの構文では、新しいキーワードを使用する必要があります。 静的メソッドのコードは、クラスのインスタンス メソッドを呼び出す前に、独自のクラスのインスタンス オブジェクトを構築する必要があります。
オーバーライド中のアクセス増加
サブクラス内でメソッドがオーバーライドされると、オーバーライドするメソッドは少なくともオーバーライドされるメソッドと同程度のアクセスが可能なことが必要です。 たとえば、次のコンパイラ ルールは、サブクラスで保護されたメソッドが上書きされる時に適用されます。
- スーパークラスのパブリック メソッドは、サブクラスのパブリック メソッドによってのみ上書きできます。
- サブクラスでは、パブリック メソッドまたは保護対象のメソッドはスーパークラスの保護対象のメソッドをオーバーライドできません。
- サブクラスでは、プライベート メソッドはスーパークラスの保護対象のメソッドをオーバーライドできません。
オプションのパラメーター
パラメーターは、メソッド宣言パラメーター リストで初期化することができます。 この場合、パラメーターはオプションのパラメーターとなります。 メソッドの呼び出しの値が指定されていない場合は、既定値が使用されます。 すべての必須パラメータは最初のオプション パラメーターの前に一覧表示する必要があります。 次の例では、オプションのパラメーターを持つメソッドを作成して呼び出す方法を示しています。
オプション パラメーターの例
次のコード例は、既定のパラメーターを持つメソッドを示しています。
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;
}
}
拡張メソッドを使用する理由
拡張メソッドの手法は、拡張するクラスのソース コードには影響しません。 ターゲット クラスへのアップグレードは、既存の拡張メソッドの影響を受けることはありません。 ただし、ターゲット クラスへのアップグレードで拡張メソッドとして同じ名前のメソッドが追加される場合、拡張メソッドはターゲット クラスのオブジェクトを通して到達できなくなります。 拡張メソッドは使いやすいです。 拡張メソッドの手法では、通常のインスタンス メソッドを呼び出すときによく使うドット区切り構文と同じものを使用します。 拡張メソッドは、ターゲット クラスのすべてのパブリック コンポーネントにアクセスできますが、保護されたまたはプライベートのオブジェクトにはアクセスできません。
拡張メソッドはどこに適用できるか
拡張メソッドのターゲットは、次のアプリケーション オブジェクト タイプのいずれかである必要があります。
- クラス
- テーブル
- 表示
- マップ
目標タイプに関係なく、拡張機能クラスはタイプに拡張メソッドを追加するために使用されます。 たとえば、拡張テーブルは、メソッドをテーブルに追加するためには使用されず、拡張テーブルというものは存在しません。
このキーワード
this キーワードは、this キーワードが使用されるクラスやテーブルのインスタンスへの参照です。 this 参照は、インスタンス メソッドの呼び出し (クラスまたはそのスーパークラスのクラスでメソッドが呼び出された場合) に必要ですが、コードを明確にし、コード エディターで IntelliSense の動作を強化できます。 すべての呼び出しインスタンス メソッドはこれを参照または変数のいずれかにより修飾される必要があります。 this 参照は、次の情報を修飾するために使用できます。
-
this 参照が使用されている同じクラス内の他のインスタンス (静的でない) メソッドの名前。 次に例を示します:
boolColorChanged = this.colorItOrange();
- this オブジェクトによって継承されるメソッドの名前。
- this キーワードが使用されるメソッドを含むテーブル上のフィールドの名前。
this 参照は、次の方法で使用できません。
- classDeclaration コードで宣言されているメンバー変数の名前を限定することはできません。
- 静的メソッドで使用できません。
- クラスやテーブルの静的メソッドの名前を限定することはできません。
入れ子になったクラス
クラスは X++ ソース コードに入れ子にできます。 入れ子になったクラスは、フォーム内 (つまり FormRun を拡張するクラス) でのみ使用でき、コントロール、データ ソースまたはデータ フィールドを表します。
職務
X++ メソッドをすばやく簡単に実行するには、static Main(xArgs args)
メソッドをクラスに追加し、そのクラスを Microsoft Visual Studio のプロジェクトのスタートアップ オブジェクト フォームとして設定します。 プロジェクトが実行されるときは、Main
メソッドが実行されます。