teratail header banner
teratail header banner
質問するログイン新規登録
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

1080閲覧

【C#】 Var や Span<T>とはどういう意味ですか。

turnberry0712

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2025/06/14 23:13

0

1

実現したいこと

C#でよく見る、VarやSpan<T>を理解したい。

  • C#でよく見る、VarやSpan<T>を理解したい。

前提

ここに質問の内容を詳しく書いてください。
・C#でよく見る、VarやSpan<T>を理解したい。
普段はvarを使わずに、変数にはint?byte?string?などをつけている。

発生している問題・エラーメッセージ

ありません。

該当のソースコード

C#

1ありません。

試したこと

ネットの海にある情報を読んでいるが、いまいちわかりづらく力にしずらい。

補足情報(FW/ツールのバージョンなど)

VisualStudio2020

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turnberry0712

2025/06/14 23:17

_buffersize = bufferSize; _buffer = new List<byte>(_buffersize); などもわかりません。なぜ接頭に_がつくのでしょうか。
fiveHundred

2025/06/15 01:14

> なぜ接頭に_がつくのでしょうか。 変数(など)の名前にはアルファベットだけでなく「_」も使えます(「array_size」など)。 なので、単に何かしら区別するために、そのような名前にしているだけです。 接頭につく場合は、大体の場合、クラスのprivateなメンバー変数であることが多いです。
turnberry0712

2025/06/15 01:21

回答ありがとうございます。 参考になります。 基本的にはプライベートなメンバー変数なのですね。 そこは決まり事で決めると思うのでなんとなくですが理解しました! 今回は本当にありがとうございます。
guest

回答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

YAmaGNZ

総合スコア10665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turnberry0712

2025/06/15 00:52

回答ありがとうございます。 こちらの回答も非常に参考になりました。 逆に使っていけない場面もあるのですね。 とても参考になります!
guest

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
Manabu

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turnberry0712

2025/06/15 23:08

回答ありがとうございます。試してみましたが解決できませんでした。 一見してみましたが、一回で分りませんでした。 また、Manabuさんの書き込んでいただきました文章を読んでゆっくり致します。   どのくらいわかってないというのは全体的にわからず、このSpan<T>があるからどうなる。どのように使える。が見てもわかりませんでした。これは私自身の読み方が悪いのでManabuさんに非はありません。 何か教材やどこかにあるものでSpan<T>について調べてみたり、Manabiさんの書き込んでくださった文章で勉強しようと思います。ありがとうございます。
turnberry0712

2025/06/16 22:51

> 古いバージョンの.Net及びC#では動作しないため、最新のバージョンで実行しましょう 回答ありがとうございます。 ここならスマホからでもできそうですね。 あとはMicrosoftのサイトの記事でも参考にしてみようと思います。 重ね重ねありがとうございます。
guest

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

fiveHundred

総合スコア10454

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turnberry0712

2025/06/15 01:42

回答ありがとうございます。 ソースコードを読んでみたのですが、 > // ちゃんと2・3・4番目だけが1になってる は、全部1になっているのではないでしょうか。ソースコードをできない環境にあります。 int[] values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; Random.Shared.Shuffle(values); values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; RandomNumberGenerator.Shuffle(values.AsSpan()); こちらでSpan<T>を使っていて、理解をしようと思っておりますが、残念ながら力及ばずわからないままです。
turnberry0712

2025/06/15 01:47

なので、現時点でもSpan<T>を理解しようとしておりますが、 あなたの書き方は分かりやすく理解しやすいのですが、私の理解不足からまだ完璧にわかっておりません。 そこに関しては申し訳ございません。
fiveHundred

2025/06/15 02:13 編集

> > // ちゃんと2・3・4番目だけが1になってる > は、全部1になっているのではないでしょうか。ソースコードをできない環境にあります。 なってません。 5~6行目でspanは「arrayの2~4番目の範囲」を定義しており、8~12行目ではその箇所の位置や長さのみが反映されます。 そして、14~18行目では(spanだけでなく)array全体を表示しているので、「0, 0, 1, 1, 1, 0, 0, 0」となります。 コメントで提示されたコードにあるvalues.AsSpan()は単に「全体のSpan<T>を返す」だけなので、全体が影響するだけです。
guest

0

そのキーワードでぐぐれば、解説がたくさん出てきます
それを出てくる限り全部読みましょう。他人に聞くのはそれから、ですよ

投稿2025/06/14 23:49

y_waiwai

総合スコア88180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turnberry0712

2025/06/15 00:03

回答ありがとうございます。試してみましたが解決できませんでした。 https://ufcpp.net/study/csharp/resource/span/ この場合どの辺りに原因がありそうでしょうか?
fiveHundred

2025/06/15 01:05

「解決できませんでした」ではなく、何が分からないのか具体的に書いてください。 それが第三者に分からないと、適切な回答は難しいですし、その原因とやらも分かりません。 以下も参考にしてください。 https://teratail.com/help/question-tips
fiveHundred

2025/06/15 01:09

例えば、「コードの書いている意味が分からない」のであれば、そのコードを提示すべきですし、「コードは分かるけど使うべきケースが分からない(配列で十分では?、など)」であればその旨を書くべきです。 あなたの場合、どちらか(もしくはどちらでもないか)すら分からず、回答するほうも困ってしまいます。
turnberry0712

2025/06/15 01:14

解答ありがとうございます。今回は「C#でよく見る、VarやSpan<T>を理解したい。」を思っております。 第三者にわからないようになってしまいすみませんでした。 C#でよく見る、VarやSpan<T>を理解したい!というのが今回の目的ですが、 Varは宣言しても、ほかの変数から予測してその変数を受け入れられるようにしているのですね! と私は解釈しました! あなたのお時間を奪ってしまってすいませんでした。すぐに返せるよう頑張ります!
turnberry0712

2025/06/15 01:15

> 「コードの書いている意味が分からない」 コードを書いているが、意味が分からず使っていないになります。 これで分かるでしょうか。わからなかったらまたコメントくださいね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問