# プロパティパス

> Understand the role of property paths and the performance considerations when using them.

プロパティパスは、コンテナオブジェクト内のプロパティの場所を示す文字列です。

## コンセプト##performance-considerations

プロパティパスを使用して、特定のパスにあるオブジェクトのデータを取得または設定したり、オブジェクトのサブプロパティのビジターを受け入れたりすることができます。

プロパティパスは文字列で構成され、ルートオブジェクトから特定のプロパティインスタンスを解決します。例えば、パス `foo.bar.baz[12]` は、`foo` コンテナにネストされている、`bar` コンテナの `baz` リストコンテナの 13 番目の要素を解決します。

プロパティパスを作成および操作するには、[`Unity.Properties.PropertyPath`](/engine/6000.0/script-reference/unity-properties/property-path.md) クラスを使用します。

プロパティパスを使用して、以下を行うことができます。

* 特定のパスにあるオブジェクトのデータを取得または設定する
* オブジェクトのサブプロパティに対する訪問者を受け入れる

## パフォーマンスの考慮点##additional-resources

[`Unity.Properties.PropertyPath`](/engine/6000.0/script-reference/unity-properties/property-path.md) は不変の構造体型です。プロパティパスを文字列から構成すると、サブ文字列を抽出するためにアロケーションが発生します。

以下の表は、プロパティパスが文字列から構成されている場合のアロケーション動作のリストです。

| 文字列                     | 長さ | アロケーション回数 | アロケーションの理由                     |
| ----------------------- | -- | --------- | ------------------------------ |
| `"Path"`                | 1  | 0         | 文字列をそのまま使用します。                 |
| `"Path.To"`             | 2  | 2         | 文字列を 2 つのパーツに分割します。            |
| `"Path.To[2]"`          | 3  | 3         | 文字列を 2 つのパーツに分割し、インデックスを抽出します。 |
| `"Path.To[2].My"`       | 4  | 4         |                                |
| `"Path.To[2].My.Value"` | 5  | 6         | 追加パーツの配列を割り当てます。               |

以下の表は、プロパティパスがパーツで構成される場合のアロケーション動作のリストです。

| 文字列                                          | 長さ | アロケーション回数 | アロケーションの理由       |
| -------------------------------------------- | -- | --------- | ---------------- |
| `PropertyPath.FromName("Path")`              | 1  | 0         |                  |
| `PropertyPath.AppendName(previous, "To")`    | 2  | 0         |                  |
| `PropertyPath.AppendIndex(previous, 2)`      | 3  | 0         |                  |
| `PropertyPath.AppendName(previous, "My")`    | 4  | 0         |                  |
| `PropertyPath.AppendName(previous, "Value")` | 5  | 1         | 追加パーツの配列を割り当てます。 |

パフォーマンスを最適化し、メモリの割り当てを回避するには、以下を行います。

* 初期化ルーチン中にプロパティパスを初期化してキャッシュします。
* 文字列から構成する代わりに、プロパティパスのパーツを最大 4 つ結合または追加します。

## 追加リソース

* [プロパティバッグ](/engine/6000.0/manual/scripting/object-oriented-development/properties/property-bags.md)
* [プロパティビジター](/engine/6000.0/manual/scripting/object-oriented-development/properties/property-visitors.md)
* [`PropertyVisitor` を使用してプロパティビジターを作成する](/engine/6000.0/manual/scripting/object-oriented-development/properties/property-visitors-propertyvisitor.md)
* [低レベル API を使用してプロパティビジターを作成する](/engine/6000.0/manual/scripting/object-oriented-development/properties/property-visitors-low-level-api.md)
