質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

1824閲覧

lambda式勉強中に出てきた [] これなんですか?

sphim13

総合スコア10

C#

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

1グッド

4クリップ

投稿2021/12/14 14:30

編集2021/12/15 06:57

なんですかこれ?

######c#のdelegate(デリゲート)やlambda式を勉強してる中にわからないコードがパっと出てきたため解説をお願いしたいです。
↓以下

該当のコード

c#

1var f = [A] static int? ([A] string? s) => s?.Length;
  • varが型推論をしてくれる有能な型
  • fが変数の名前
  • [A]は分からない
  • staticはクラスをインスタンス化したときにそのインスタンス先によって値が変わらない静的な意味を持つ修飾語
  • int?は値がnullでも構いませんよ系の整数を扱う型
  • ()の中身は引数や戻り値の型の条件
  • => はこいつが呼び出されたとき右のコードを実行しますよ的なもの
  • s?.Lengthはsがnullの時にはsをnullじゃないときはs.Lengthを戻り値として返す値

現時点でこのような解釈をしてます。
[A]の正体や構文がわかりませんのでご教授お願い致します。
また間違った解釈をしていたらご指摘のほうをしてくださるとありがたいです。

補足情報

使用したサイト
リンク

fana👍を押しています

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

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

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

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

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

m.ts10806

2021/12/14 19:59

c# 角かっこ とかで調べたら出てきそうに思いますが、何か調べたことはあるのでしょうか。
退会済みユーザー

退会済みユーザー

2021/12/15 00:18

× deligate 〇 delegate
sphim13

2021/12/15 06:54

m.ts10806 コメントありがとうございます。自分の怠慢で調べませんでした。「c# 角かっこ」簡単に出てくるんですね。以後気を付けたいと思います。
sphim13

2021/12/15 06:58

radian コメントありがとうございます。お恥ずかしい.......。修正しました。
guest

回答3

0

ベストアンサー

  • varは型推論(コンパイラに型を決めてもらう)
  • fが変数の名前
  • [A]は属性
  • staticはこのラムダ式内にローカル変数が含まれていないことを示す
  • int?はnull許容値型、System.Nullable<int>のこと
  • 戻り値の型 () => 戻り値 でラムダ式の文法
  • s?.Lengthはsがnullの時にはnullを、nullじゃないときはs.Lengthを戻り値として返す値

投稿2021/12/14 23:53

ozwk

総合スコア13553

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

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

sphim13

2021/12/15 06:42

回答ありがとうございました。[A]は属性というものなのですね。属性というものを知らないので検索掛けてみようと思います。
guest

0

該当のコード

C# 10.0 でのラムダ式 - デリゲート - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
これですね。

C# 10.0で書けるようになった「ラムダ式の全部入り」みたいなもので、文脈的にC# 3.0から一気に飛ぶので唐突感はありますね。

読み進めていけばどこかに説明はありますが、実際に目にしたときに調べるくらいの気持ちで流してしまっていいと思います(目にすることがあるかもわからないし、あったとしてもだいぶ先だと思います)


とはいえ間違った認識のままというわけにもいかないので、リンク多めで説明します(詳細はリンク先を見てねということ^^;

varが型推論をしてくれる有能な型

いいえ。
便利型のようなものではありません。型ははっきり決まります。

Func<string?, int?>と推論されますが、この場合は特に「自然型」というC# 10の最新機能です。

デリゲートの自然な型 - デリゲート - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

ラムダ式の自然型 - ラムダ式 - C# リファレンス | Microsoft Docs

fが変数の名前

はい。
Func<string?, int?>型の変数fです。

[A]は分からない

「ラムダ式にも属性を付けれるようになった」という例です(C# 10)
例のためのAAttributeなので、それ以上の意味はありません([A]としても何かが起きるわけではありません)

属性 - ローカル関数と匿名関数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

属性 - ラムダ式 - C# リファレンス | Microsoft Docs

属性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

属性 (C#) | Microsoft Docs

staticはクラスをインスタンス化したときにそのインスタンス先によって値が変わらない静的な意味を持つ修飾語

staticはいろんなところに付けられますが、この場合ラムダ式に付けて外部の変数をキャプチャしないという意味になります(C# 9.0)

静的匿名関数 - ローカル関数と匿名関数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

ラムダ式における外部変数のキャプチャと変数のスコープ - ラムダ式 - C# リファレンス | Microsoft Docs

int?は値がnullでも構いませんよ系の整数を扱う型

まあそうですがこの場合の意図は、「ラムダ式の戻り値の型を明示できるようになった」という点です(C# 10)

戻り値の型の明示 - ローカル関数と匿名関数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

宣言された戻り値の型 - ラムダ式 - C# リファレンス | Microsoft Docs

null許容値型(Nullable<T> 型) - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

null 許容値型 - C# リファレンス | Microsoft Docs

()の中身は引数や戻り値の型の条件

いいえ。
string?型の引数sに、属性Aが付いています。
戻り値は関係しないです(戻り値の型はint?です)

=> はこいつが呼び出されたとき右のコードを実行しますよ的なもの

はい。
ラムダ演算子(lambda operator)だそうですが、それで皆に通じるかどうかはわかりません^^;

匿名関数 (ラムダ式) - ローカル関数と匿名関数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

=> 演算子 - C# リファレンス | Microsoft Docs

s?.Lengthはsがnullの時にはsをnullじゃないときはs.Lengthを戻り値として返す値

はい。
意味は同じですが、「snullの時はnullを返す」と言ったほうがわかりやすいでしょう。

null 条件演算子(null が来たら null を返す) - null の取り扱い - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

Null 条件演算子 ?. および ?[] - メンバー アクセス演算子と式 - C# リファレンス | Microsoft Docs

投稿2021/12/15 09:15

TN8001

総合スコア9862

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

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

sphim13

2021/12/15 09:37

回答ありがとうございました。非常に丁寧な解説で知識を深めることができました。varについて少し調べようと思います。
guest

0

[A]の正体や構文がわかりませんのでご教授お願い致します。

あなたが参考にした「使用したサイト」に "属性や戻り値の型が指定できる" と書いてある通り属性を表しているようです。属性が何かはそこから詳しい説明へのリンクが張ってありますが見ませんでしたか?

投稿2021/12/14 23:30

編集2021/12/14 23:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sphim13

2021/12/15 06:47

回答ありがとうございました。属性 = プロパティ = 名前{set;get;}の奴だろうと高をくくっていました。完全に見落としてました。今度からは注意したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問