# 配列の要素数につきまして

**URL:** <https://forum.uipath.com/t/topic/142464>\
**Category:** フォーラム\
**Tags:** activities\
**Created:** [August 16, 2019, 12:50am UTC](https://forum.uipath.com/t/topic/142464 "2019-08-16T00:50:47Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![uchacha](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/uchacha/32/88294_2.png) [@uchacha](https://forum.uipath.com/u/uchacha)\
**Post date:** [August 16, 2019, 12:50am UTC](https://forum.uipath.com/t/topic/142464/1 "2019-08-16T00:50:47Z")

</div>

お世話になります。Uipathか.Netかどちらの仕様かわかりませんが  
以下のようなことをした際に、配列の要素数が2→10に増えてますが  
そういうものなのでしょうか。  
※個人的には最初に要素数2で宣言していた場合は増えない認識でした。

なぜこのような動きになるのか不明でなので  
ご教示頂ければと思います。

■実施した動作  
①文字列配列「ArrayFile」を作成

変数名；ArrayFile  
型；String  
初期値：new string(1){“A”,“A”}

②ArrayFile.Lengthの結果は2

③AssignでArrayFileにsystem.IO.Directory.GetFiles(“C:\temp”)を代入する  
※C:\tempには10個のExcelファイルしかない

④ArrayFile.Lengthの結果は10

---

<div class="post-metadata">

**Author:** ![HANACCHI](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/hanacchi/32/85375_2.png) [@HANACCHI](https://forum.uipath.com/u/HANACCHI)\
**Post date:** [August 16, 2019, 1:09am UTC](https://forum.uipath.com/t/topic/142464/2 "2019-08-16T01:09:39Z")

</div>

多分、  
System.IO.Directory.GetFiles  
が綺麗な配列を返却したため？

> **[Directory.GetFiles メソッド (System.IO)](https://learn.microsoft.com/ja-jp/dotnet/api/system.io.directory.getfiles?view=netframework-4.8)**
>
> 指定した条件を満たすファイルの名前を返します。

配列数２と限定しているのは、仕様なのでしょうか？  
なら、GetFilesからの返却配列で、必要数を捕らえるのは出来ますね。

ただ、GetFilesからの返却配列の順番は不定のようですので、Sortなんなりの処理は必要ですね。

---

<div class="post-metadata">

**Author:** ![uchacha](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/uchacha/32/88294_2.png) [@uchacha](https://forum.uipath.com/u/uchacha)\
**Post date:** [August 16, 2019, 1:46am UTC](https://forum.uipath.com/t/topic/142464/3 "2019-08-16T01:46:02Z")

</div>

ありがとうございます。  
System.IO.Directory.GetFilesに限らず  
配列で返すようなものを受け取った際には  
宣言した要素数を無視するってことですかね？

配列数２としてSystem.IO.Directory.GetFilesをしたいのではなく  
今回たまたまこういうことを発見したので  
宣言した要素数より増えることがあるのかが知りたかった次第です。

---

<div class="post-metadata">

**Author:** ![HANACCHI](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/hanacchi/32/85375_2.png) [@HANACCHI](https://forum.uipath.com/u/HANACCHI)\
**Post date:** [August 16, 2019, 1:51am UTC](https://forum.uipath.com/t/topic/142464/4 "2019-08-16T01:51:15Z")

</div>

GetFilesちゃんの言い分としては、

ちゃんとフォルダ中のファイル一覧を取ったよ、  
全部返却するから、あとは好きにしてね

って事でしょうね。

---

<div class="post-metadata">

**Author:** ![uchacha](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/uchacha/32/88294_2.png) [@uchacha](https://forum.uipath.com/u/uchacha)\
**Post date:** [August 16, 2019, 2:35am UTC](https://forum.uipath.com/t/topic/142464/5 "2019-08-16T02:35:11Z")

</div>

そうなんですね。  
GetFiles「一覧10個あるよー全部渡すね」  
配列(UiPath)「ええ～。2個しかもてないから受け取れないよ～」  
でエラーにならずに  
配列(UiPath)「よし10個分格納できるようにしたぜ。確かに受け取ったぜ」  
ってなるんですね、

---

<div class="post-metadata">

**Author:** ![cheez\_RPA](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/cheez_rpa/32/278069_2.png) [@cheez\_RPA](https://forum.uipath.com/u/cheez_RPA)\
**Post date:** [August 16, 2019, 2:47am UTC](https://forum.uipath.com/t/topic/142464/6 "2019-08-16T02:47:53Z")

</div>

説明が難しいのですが、GetFilesが返すものが「配列全体」そのものであるので、それを変数に代入しているために発生する挙動だと思います。

---

<div class="post-metadata">

**Author:** ![uchacha](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/uchacha/32/88294_2.png) [@uchacha](https://forum.uipath.com/u/uchacha)\
**Post date:** [August 16, 2019, 2:54am UTC](https://forum.uipath.com/t/topic/142464/7 "2019-08-16T02:54:31Z")

</div>

あー  
イメージとしては配列をまるっと受け取る  
なので再度宣言しなおしている感じですかね。

ArrayFile = new string(10){“C:\temp\1.xlsx”,“C:\temp\2.xlsx”～～～}

のような。

---

<div class="post-metadata">

**Author:** ![cheez\_RPA](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/cheez_rpa/32/278069_2.png) [@cheez\_RPA](https://forum.uipath.com/u/cheez_RPA)\
**Post date:** [August 16, 2019, 3:15am UTC](https://forum.uipath.com/t/topic/142464/8 "2019-08-16T03:15:25Z")

</div>

> [@uchacha](#):
>
> なので再度宣言しなおしている感じですかね。

厳密には違っていまして、UiPathというよりも .NET（というより数多あるプログラミング言語のいくつか）の仕様として配列を変数に格納するときは、配列の中身が変数に入るのではなく、配列がメモリ上どこにあるかという位置が変数に入ります。

> [@uchacha](#):
>
> ③AssignでArrayFileにsystem.IO.Directory.GetFiles(“C:\temp”)を代入する  
> ※C:\tempには10個のExcelファイルしかない

上記のタイミングで、それまでに作っていた配列の「位置」の情報が、新しくGetFilesで生成された配列の「位置」に置き換わった、というイメージです。

---

<div class="post-metadata">

**Author:** ![uchacha](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/uchacha/32/88294_2.png) [@uchacha](https://forum.uipath.com/u/uchacha)\
**Post date:** [August 16, 2019, 3:28am UTC](https://forum.uipath.com/t/topic/142464/9 "2019-08-16T03:28:51Z")

</div>

んー  
GetFilesで生成された配列のアドレスを  
ArrayFileは見に行っているってことですよね。

★GetFilesする前  
ArrayFileはメモリ上の00000000を参照(初期に確保された領域)  
※アドレスは適当

★GetFilesした後  
ArrayFileはメモリ上の00000010を参照(GetFilesに確保された領域)  
※アドレスは適当

理解が乏しいですが、たぶんこのような感じかなと。。

なのでGetFiles前に確保していた領域は解放されているかもしくは残ったままか

---

<div class="post-metadata">

**Author:** ![cheez\_RPA](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/cheez_rpa/32/278069_2.png) [@cheez\_RPA](https://forum.uipath.com/u/cheez_RPA)\
**Post date:** [August 16, 2019, 3:33am UTC](https://forum.uipath.com/t/topic/142464/10 "2019-08-16T03:33:47Z")

</div>

> [@uchacha](#):
>
> なのでGetFiles前に確保していた領域は解放されているかもしくは残ったままか

そうですね。たぶんガベージコレクトで消えるはずです。

---

<div class="post-metadata">

**Author:** ![uchacha](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/uchacha/32/88294_2.png) [@uchacha](https://forum.uipath.com/u/uchacha)\
**Post date:** [August 16, 2019, 4:39am UTC](https://forum.uipath.com/t/topic/142464/11 "2019-08-16T04:39:37Z")

</div>

ありがとうございます。  
とりあえず解放の部分を調べようと思いましたが  
UiPath(.Net)でアドレス取得のやり方が不明だったのであきらめます。

---

<div class="post-metadata">

**Author:** ![Risa](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/risa/32/84330_2.png) [@Risa](https://forum.uipath.com/u/Risa)\
**Post date:** [August 16, 2019, 2:12pm UTC](https://forum.uipath.com/t/topic/142464/12 "2019-08-16T14:12:04Z")

</div>

> [@cheez\_RPA](#):
>
> そうですね。たぶんガベージコレクトで消えるはずです。

System.IO.GetFiles()の、ソースコードを追っていくと、List\<String\>で結果を作成したあと、ToArray()していました。

更に、その中を辿ると、

```
T[] array = new T[_size];
Array.Copy(_items, 0, array, 0, _size);
return array;

```

と、新規に領域を確保しています。  
System.Arrayはマネージド型なので、破棄されている筈です。

---

<div class="post-metadata">

**Author:** ![Risa](https://sea2.discourse-cdn.com/uipath/user_avatar/forum.uipath.com/risa/32/84330_2.png) [@Risa](https://forum.uipath.com/u/Risa)\
**Post date:** [August 16, 2019, 2:16pm UTC](https://forum.uipath.com/t/topic/142464/13 "2019-08-16T14:16:21Z")

</div>

厳密な調査では、ないのですが、[ArrayCreateTest.xaml](https://forum.uipath.com/uploads/short-url/jy61CuYcrU649ifIvvNOxfoSisJ.xaml) (6。1 キロバイト)  
Garbage Collectionの世代を見ることで、新しく配置されていることは、確認できますね。

前の配列が、きちんと破棄されることを確認するには、巨大な配列を用意して、GC.Collectした後、ヒープが解放されるか、空きメモリをチェックするぐらいしか、方法が思いつきません。
