C#でサイズを取得・変換する方法|文字列・配列・ファイル・画面サイズの違いをわかりやすく解説

はじめに

C#でプログラミングをしていると、「サイズ」を取得したい場面は非常に多くあります。文字列の文字数、配列の要素数、ファイル容量、画面やウィンドウの寸法など、対象によって取得方法が異なるため混乱しやすいです。本記事では、C#で扱うさまざまな「サイズ」の意味と取得・変換方法をわかりやすく解説します。

1. C#の「サイズ」とは?検索ユーザーが混同しやすい意味を整理

1-1. C#で「サイズ」と呼ばれる主な対象一覧

C#で「サイズ」と言う場合、主に次のような対象が考えられます。

  • 文字列の文字数・バイト数

  • 配列やコレクションの要素数

  • ファイルの容量

  • 画像や画面・ウィンドウの幅・高さ

  • メモリ上のオブジェクトサイズ

1-2. Length・Count・Size・Width/Height・Byteの違い

  • Length:配列や文字列の長さ(要素数や文字数)

  • Count:ListやICollectionなどの要素数

  • Size:構造体やUI要素の幅・高さの組み合わせを示すことが多い

  • Width/Height:画像やウィンドウの横・縦のピクセル数

  • Byte:文字列やファイルなど、メモリ上の容量をバイト単位で表す

1-3. 「要素数」「文字数」「バイト数」「表示サイズ」の違い

  • 要素数:配列やリストなどの個数

  • 文字数:文字列の文字単位の長さ

  • バイト数:文字列やファイルのメモリ消費量

  • 表示サイズ:画面上の見た目の寸法(ピクセルやポイント)

1-4. まず確認すべきサイズ取得の目的

サイズを取得する前に、「何のサイズが必要か」を明確にすることが重要です。文字列の文字数なのか、バイト数なのか、配列の要素数なのかによって使用するプロパティやメソッドが異なります。

2. 文字列のサイズを取得する方法

2-1. string.Lengthで文字数を取得する

C#
string text = "こんにちは";
int length = text.Length;
Console.WriteLine(length); // 出力: 5

Lengthは文字列の文字数を返します。

2-2. 日本語・絵文字・サロゲートペアでLengthがずれるケース

日本語や絵文字、サロゲートペアを含む場合、1文字でもLengthは2以上になることがあります。絵文字などの特殊文字はUTF-16で2コードユニットになるためです。

2-3. Encoding.GetByteCountで文字列のバイト数を取得する

C#
using System.Text;

string text = "こんにちは";
int byteCount = Encoding.UTF8.GetByteCount(text);
Console.WriteLine(byteCount); // UTF-8バイト数を表示

文字列のバイト数を取得する際に使用します。

2-4. UTF-8・Shift_JIS・UTF-16でバイト数が変わる理由

文字エンコーディングによって1文字あたりのバイト数が異なります。UTF-8は可変長、Shift_JISは日本語文字が2バイト、UTF-16は2バイトまたは4バイトとなるため、同じ文字列でもバイト数が変わります。

2-5. 文字列サイズ取得でよくあるエラーと対処法

  • null参照の文字列に対してLengthを呼び出す
    → nullチェックを必ず行う

  • バイト数と文字数を混同する
    → Encoding.GetByteCountとLengthの違いを理解する

3. 配列・List・コレクションのサイズを取得する方法

3-1. 配列の要素数はLengthで取得する

C#
int[] numbers = {1, 2, 3, 4};
Console.WriteLine(numbers.Length); // 出力: 4

3-2. List<T>の要素数はCountで取得する

C#
List<string> names = new List<string> {"Alice", "Bob"};
Console.WriteLine(names.Count); // 出力: 2

3-3. IEnumerable<T>でCount()を使うときの注意点

IEnumerable<T>にはCountプロパティがありません。LINQのCount()拡張メソッドを使用しますが、列挙時に全要素を走査するためコストが高くなる場合があります。

3-4. 多次元配列・ジャグ配列のサイズ取得方法

  • 多次元配列:array.GetLength(dimension)

  • ジャグ配列:各要素ごとにLengthで確認

3-5. LengthとCountの使い分け早見表

対象プロパティ
配列Length
ListCount
ICollectionCount
IEnumerableCount()

4. ファイルサイズを取得・変換する方法

4-1. FileInfo.Lengthでファイルサイズを取得する

C#
using System.IO;

FileInfo file = new FileInfo("sample.txt");
Console.WriteLine(file.Length); // バイト単位

4-2. バイトからKB・MB・GBへ変換する方法

C#
double sizeKB = file.Length / 1024.0;
double sizeMB = sizeKB / 1024.0;

4-3. 小数点や単位を整えて見やすく表示する方法

C#
Console.WriteLine($"{sizeMB:F2} MB");

4-4. ファイルが存在しない場合の例外処理

C#
if (!file.Exists)
{
Console.WriteLine("ファイルが存在しません");
}

4-5. 複数ファイル・フォルダ全体のサイズを取得する方法

ディレクトリ内の全ファイルを取得して、Lengthを合計することでフォルダサイズを算出可能です。

5. 画像・画面・ウィンドウサイズを取得する方法

5-1. 画像ファイルの幅・高さを取得する方法

C#
using System.Drawing;

Image img = Image.FromFile("image.png");
Console.WriteLine($"幅: {img.Width}, 高さ: {img.Height}");

5-2. Windows Formsで画面サイズを取得する方法

C#
var screenWidth = Screen.PrimaryScreen.Bounds.Width;
var screenHeight = Screen.PrimaryScreen.Bounds.Height;

5-3. WPFでウィンドウサイズを取得する方法

C#
double width = this.Width;
double height = this.Height;

5-4. DPI・スケーリングで表示サイズが変わる理由

高DPI環境では、ピクセル数と画面上の物理サイズが一致しない場合があります。

5-5. ピクセルサイズと実際の表示サイズの違い

物理的な表示サイズはDPIや拡大縮小設定に依存するため、Width/Heightと実際の表示サイズは一致しないことがあります。

6. オブジェクトやデータのメモリサイズを確認する方法

6-1. C#でオブジェクトのサイズ取得が難しい理由

C#はマネージド言語のため、ガベージコレクションや内部構造によって正確なサイズを簡単に取得できません。

6-2. sizeof演算子で値型のサイズを取得する

C#
Console.WriteLine(sizeof(int)); // 出力: 4

6-3. Marshal.SizeOfで構造体サイズを取得する

C#
using System.Runtime.InteropServices;

Console.WriteLine(Marshal.SizeOf(typeof(MyStruct)));

6-4. GC.GetTotalMemoryでメモリ使用量を確認する

C#
long mem = GC.GetTotalMemory(false);
Console.WriteLine($"{mem} bytes");

6-5. メモリサイズ取得時の注意点

オブジェクト単位の正確なサイズは取得困難。参照型の場合、内部の参照やガベージコレクションの影響で値が変動します。

7. サイズ変換で使える実用コード例

7-1. バイト数をKB・MB・GBに自動変換するメソッド

C#
string FormatSize(long bytes)
{
if (bytes >= 1024*1024*1024) return $"{bytes/1024.0/1024.0/1024.0:F2} GB";
if (bytes >= 1024*1024) return $"{bytes/1024.0/1024.0:F2} MB";
if (bytes >= 1024) return $"{bytes/1024.0:F2} KB";
return $"{bytes} B";
}

7-2. 文字列の文字数とバイト数を同時に取得するメソッド

C#
void PrintStringInfo(string text)
{
int length = text.Length;
int bytes = Encoding.UTF8.GetByteCount(text);
Console.WriteLine($"文字数: {length}, バイト数: {bytes}");
}

7-3. ファイルサイズを人間が読みやすい形式で表示するメソッド

上記FormatSizeメソッドとFileInfo.Lengthを組み合わせることで簡単に表示可能です。

7-4. 配列・List・文字列のサイズを比較するサンプル

C#
int[] arr = {1,2,3};
List<int> list = new List<int>{1,2,3};
string text = "abc";

Console.WriteLine(arr.Length);
Console.WriteLine(list.Count);
Console.WriteLine(text.Length);

7-5. nullや空データに対応した安全なサイズ取得

C#
int safeLength = text?.Length ?? 0;
int safeCount = list?.Count ?? 0;

8. よくある間違いとトラブル解決

8-1. LengthとCountを逆に使ってしまう

配列ではLength、ListではCountを使うことを意識しましょう。

8-2. 文字数とバイト数を同じものとして扱ってしまう

日本語や絵文字ではLengthとバイト数が異なるため注意が必要です。

8-3. ファイルサイズのKB計算を1000と1024で迷う

ファイルサイズはコンピュータ内部で1024単位、SI表記で1000単位と用途に応じて使い分けます。

8-4. 画面サイズが想定と違う値になる

DPIや拡大縮小設定の影響でWidth/Heightが想定と異なる場合があります。

8-5. オブジェクトサイズを正確に取得できない

マネージドオブジェクトは内部構造やガベージコレクションで正確なサイズを把握しにくいため、概算で判断します。

9. C#のサイズ取得・変換に関するFAQ

9-1. C#で文字列のサイズを取得するには?

string.Lengthで文字数、Encoding.GetByteCountでバイト数を取得できます。

9-2. C#で配列のサイズを取得するには?

配列はLength、ListやICollectionはCountを使用します。

9-3. C#でファイルサイズをMB表示するには?

FileInfo.Lengthを取得後、1024で割ってMB単位に変換します。

9-4. C#で画面サイズを取得するには?

Windows FormsならScreen.PrimaryScreen.Bounds、WPFならWindow.Width/Window.Heightを使用します。

9-5. C#でオブジェクトのメモリサイズは取得できる?

値型ならsizeof、構造体ならMarshal.SizeOf、メモリ全体はGC.GetTotalMemoryで確認可能ですが、正確なサイズは取得困難です。

まとめ

C#で「サイズ」を扱う際は、対象によって取得方法が異なることを理解することが重要です。文字列、配列、ファイル、画面、オブジェクトの各サイズを正しく取得・変換する方法を把握することで、エラーや混乱を避けることができます。実用コード例も活用して、効率よく正確なサイズ情報を取得しましょう。