実現したいこと
C#でよく見る、VarやSpan<T>を理解したい。
- C#でよく見る、VarやSpan<T>を理解したい。
前提
ここに質問の内容を詳しく書いてください。
・C#でよく見る、VarやSpan<T>を理解したい。
普段はvarを使わずに、変数にはint?byte?string?などをつけている。
発生している問題・エラーメッセージ
ありません。
該当のソースコード
C#
1ありません。
試したこと
ネットの海にある情報を読んでいるが、いまいちわかりづらく力にしずらい。
補足情報(FW/ツールのバージョンなど)
VisualStudio2020
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/06/15 01:14

回答4件
0
ベストアンサー
多分var
に関しては「型を推論してくれる」というのは前の質問や検索などで理解されているとは思います。
なのでvar a = 0;
と書いてもint a = 0;
と書いても同じなのにわざわざvar
を使う利点はあるのかということが聞きたいのでなないかと思います。
C#
1Dictionary<int,List<string>> aaa = new Dictionary<int,List<string>>(); 2foreach (KeyValuePair<int, List<string>> item in aaa) 3{ 4}
といった定義やループをする際に
C#
1var aaa = new Dictionary<int,List<string>>(); 2foreach (var item in aaa) 3{ 4}
と書いたほうが見やすいといった可読性がよくなる場合とか
C#
1var a = new {index = 1, Name = "teratail"};
といった匿名型を使用する場合です。
逆に使用しないほうがいい場合は
C#
1var a = myMethod();
と見ても型がわからない場合になります。
また使う場合でもなるべく一目で型が分かるような変数名にするといいでしょう。
投稿2025/06/15 00:42
総合スコア10665
0
既に解決済みですがSapn<T>
について補足を残しておきます
Span<T>
とはref構造体
の一つです
これはオブジェクトインスタンスがスタックに確保されることを保障するデータ型です
以下二つの宣言は同じ意味を持ちます
Span<int> span=[1,2,3,4,5]; Span<int> sapn2=stackalloc int[]{1,2,3,4,5};
これらはスタック領域に配列を確保します
配列といえばヒープに生成されるオブジェクトですが、Span<T>
を使うことでそれをスタックに構築します
厳密には、Span<T>
が行うことは確保された配列の要素への参照です
これを理解するにはref変数
について知る必要があります
ref変数
ref変数
とはデータ領域を参照する変数です
オブジェクトを参照するインスタンス変数とは異なり、代入されたデータ領域本体へアクセスする点が特徴です
int[] arr=[1,2,3,4,5]; ref int refMem=ref arr[1]; ++refMem; Console.WriteLine(string.Join(“,”,arr));
1,3,3,4,5
ref構造体
ref構造体
はこのref変数
をフィールドメンバとして定義します
ref struct Sample{ ref int refVal; }
Span<T>
もこの内部メンバを介して配列の要素へアクセスします
配列の参照
前述した以下のコードでは、ref変数
が単一の配列要素を参照していました
ref int refMem=ref arr[1];
ref変数
をメンバに持つSpan<T>
であれば、必然的に同様の操作が可能です
冒頭ではスタックに確保した配列を参照していましたが、ヒープ上の配列に対しても参照を指定することができます
Span<T> span=new(arr,1,3);
Span<T>
は構造体なので、ref変数
を高度に抽象化します
さらにスタックでもヒープでも参照可能であるref変数
の性質を活かし、配列の単一参照を応用した配列の部分参照をサポートします
結果として、初期化時に指定された配列の局所範囲が、Span<T>
で参照されます
Span<int> span=new(arr,1,3); span[2]=8; Console.WriteLine(string.Join(“,”,arr));
1,2,3,8,5
その他のSpan<T>
に関する解説は、以下をご覧ください
(Span<T>
構造体)
https://learn.microsoft.com/ja-jp/dotnet/api/system.span-1?view=net-8.0#constructors
投稿2025/06/15 22:47
編集2025/06/15 22:53総合スコア120
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
解決済みですが、なぜかSpan<T>についてがどこにもないので、記載しておきます。
Span<T>は「配列や文字列の一部分を直接参照している」もので、それを変更すれば元の配列などにも反映される、というものです。
質問者が提示したサイトにもありますが、
C#
1// 長さ 8 で配列作成 2// C# の仕様で、全要素 0 で作られる 3var array = new int[8]; 4 5// 配列の、2番目(0 始まりなので3要素目)から、3要素分の範囲 6var span = new Span<int>(array, 2, 3); 7 8// その範囲だけを 1 に上書き 9for (int i = 0; i < span.Length; i++) 10{ 11 span[i] = 1; 12} 13 14// ちゃんと、2, 3, 4 番目だけが 1 になってる 15foreach (var x in array) 16{ 17 Console.WriteLine(x); // 0, 0, 1, 1, 1, 0, 0, 0 18}
といった具合に、配列の途中のみを参照するものです。
それを編集することでその途中の部分のみを元の配列などに反映することができます。
投稿2025/06/15 01:29
総合スコア10454
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
そのキーワードでぐぐれば、解説がたくさん出てきます
それを出てくる限り全部読みましょう。他人に聞くのはそれから、ですよ
投稿2025/06/14 23:49
総合スコア88180
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/06/15 01:05
2025/06/15 01:09

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。