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

回答編集履歴

1

見直しキャンペーン中

2023/07/28 15:09

投稿

TN8001
TN8001

スコア10112

answer CHANGED
@@ -1,96 +1,96 @@
1
- 注)私はUnityに詳しくないので、mori.heyさんの環境で使用できるのかはわかりません。
2
-
3
- > Unity内のC#で引数を渡す際に,Pythonのようにリストや辞書をアンパックして渡したいです.
4
-
5
- なぜタプルが出てこないのかという気がしますが、C#にも`ValueTuple`というものがあります。
6
-
7
- [タプル型 - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/value-tuples)
8
- [タプルとその他の型の分解 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/functional/deconstruct)
9
-
10
- これを利用すれば、ほぼ同じような使用感になるんじゃないでしょうか。
11
-
12
-
13
- 本当は`record`が使えればいうことないんですが、これはまだ使えないんでしょうね^^;
14
- [C# 9.0 の新機能 - C# ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9#record-types)
15
- [レコード型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/datatype/record/)
16
-
17
- Unityではありません。コンソールアプリです。
18
- ```C#
19
- using System;
20
-
21
- namespace Questions352883
22
- {
23
- class Program
24
- {
25
- static void Main()
26
- {
27
- // ValueTuple
28
- var valueTuple = new Character(("hogeman", 1, 2, 3, 4));
29
- Console.WriteLine(valueTuple); // name:hogeman, hp:1, mp:2, atk:3, def:4
30
-
31
- // あくまで順番しか見ない。名前を付けたところで順番が変わるわけでも名前を間違えても関係ない
32
- // ※警告はでるので間違いに気が付かないというわけではない。
33
- // 警告 CS8123 ターゲット型 '(string name, int hp, int mp, int atk, int def)' によって異なる名前が指定されている、または名前が何も指定されていないため、タプル要素名 '○○' は無視されます。
34
- valueTuple = new Character(("hogeman", mp: 1, hp: 2, hoge: 3, 4));
35
- Console.WriteLine(valueTuple); // name:hogeman, hp:1, mp:2, atk:3, def:4
36
-
37
-
38
- // record
39
- var record = new Character(new CharacterParams("hogeman", 1, 2, 3, 4));
40
- Console.WriteLine(record); // name:hogeman, hp:1, mp:2, atk:3, def:4
41
-
42
- // コンパイルエラー
43
- // 「名前付き引数」のルールを守らないとコンパイルできないので間違いようがない
44
- // [名前付き引数と省略可能な引数 - C# プログラミング ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#named-arguments)
45
- // [オプション引数・名前付き引数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/sp4_optional.html#named)
46
- //record = new Character(new CharacterParams("hogeman", mp: 1, hp: 2, hoge: 3, 4));
47
- //record = new Character(new CharacterParams("hogeman", mp: 1, hp: 2, hoge: 3, hp: 4));
48
- //record = new Character(new CharacterParams("hogeman", hp: 1, hp: 2, atk: 3, def: 4));
49
- //record = new Character(new CharacterParams(1, 2, 3, 4, name: "hogeman"));
50
-
51
- record = new Character(new CharacterParams("hogeman", 1, def: 2, atk: 3, mp: 4));
52
- Console.WriteLine(record); // name:hogeman, hp:1, mp:4, atk:3, def:2
53
-
54
- record = new Character(new CharacterParams(hp: 1, def: 2, atk: 3, mp: 4, name: "hogeman"));
55
- Console.WriteLine(record); // name:hogeman, hp:1, mp:4, atk:3, def:2
56
- }
57
- }
58
-
59
- record CharacterParams(string name, int hp, int mp, int atk, int def);
60
-
61
- class Character
62
- {
63
- string name;
64
- int hp;
65
- int mp;
66
- int atk;
67
- int def;
68
-
69
- public Character(string name, int hp, int mp, int atk, int def)
70
- {
71
- this.name = name;
72
- this.hp = hp;
73
- this.mp = mp;
74
- this.atk = atk;
75
- this.def = def;
76
- }
77
-
78
- // ValueTuple用
79
- public Character((string name, int hp, int mp, int atk, int def) @params)
80
- {
81
- (name, hp, mp, atk, def) = @params;
82
- }
83
-
84
- // record用
85
- public Character(CharacterParams @params)
86
- {
87
- (name, hp, mp, atk, def) = @params;
88
- }
89
-
90
- public override string ToString()
91
- {
92
- return $"name:{name}, hp:{hp}, mp:{mp}, atk:{atk}, def:{def}";
93
- }
94
- }
95
- }
1
+ 注)私はUnityに詳しくないので、mori.heyさんの環境で使用できるのかはわかりません。
2
+
3
+ > Unity内のC#で引数を渡す際に,Pythonのようにリストや辞書をアンパックして渡したいです.
4
+
5
+ なぜタプルが出てこないのかという気がしますが、C#にも`ValueTuple`というものがあります。
6
+
7
+ [タプル型 - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/value-tuples)
8
+ [タプルとその他の型の分解 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/functional/deconstruct)
9
+
10
+ これを利用すれば、ほぼ同じような使用感になるんじゃないでしょうか。
11
+
12
+
13
+ 本当は`record`が使えればいうことないんですが、これはまだ使えないんでしょうね^^;
14
+ [C# 9.0 の新機能 - C# ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9#record-types)
15
+ [レコード型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/datatype/record/)
16
+
17
+ Unityではありません。コンソールアプリです。
18
+ ```cs
19
+ using System;
20
+
21
+ namespace Questions352883
22
+ {
23
+ class Program
24
+ {
25
+ static void Main()
26
+ {
27
+ // ValueTuple
28
+ var valueTuple = new Character(("hogeman", 1, 2, 3, 4));
29
+ Console.WriteLine(valueTuple); // name:hogeman, hp:1, mp:2, atk:3, def:4
30
+
31
+ // あくまで順番しか見ない。名前を付けたところで順番が変わるわけでも名前を間違えても関係ない
32
+ // ※警告はでるので間違いに気が付かないというわけではない。
33
+ // 警告 CS8123 ターゲット型 '(string name, int hp, int mp, int atk, int def)' によって異なる名前が指定されている、または名前が何も指定されていないため、タプル要素名 '○○' は無視されます。
34
+ valueTuple = new Character(("hogeman", mp: 1, hp: 2, hoge: 3, 4));
35
+ Console.WriteLine(valueTuple); // name:hogeman, hp:1, mp:2, atk:3, def:4
36
+
37
+
38
+ // record
39
+ var record = new Character(new CharacterParams("hogeman", 1, 2, 3, 4));
40
+ Console.WriteLine(record); // name:hogeman, hp:1, mp:2, atk:3, def:4
41
+
42
+ // コンパイルエラー
43
+ // 「名前付き引数」のルールを守らないとコンパイルできないので間違いようがない
44
+ // [名前付き引数と省略可能な引数 - C# プログラミング ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#named-arguments)
45
+ // [オプション引数・名前付き引数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/sp4_optional.html#named)
46
+ //record = new Character(new CharacterParams("hogeman", mp: 1, hp: 2, hoge: 3, 4));
47
+ //record = new Character(new CharacterParams("hogeman", mp: 1, hp: 2, hoge: 3, hp: 4));
48
+ //record = new Character(new CharacterParams("hogeman", hp: 1, hp: 2, atk: 3, def: 4));
49
+ //record = new Character(new CharacterParams(1, 2, 3, 4, name: "hogeman"));
50
+
51
+ record = new Character(new CharacterParams("hogeman", 1, def: 2, atk: 3, mp: 4));
52
+ Console.WriteLine(record); // name:hogeman, hp:1, mp:4, atk:3, def:2
53
+
54
+ record = new Character(new CharacterParams(hp: 1, def: 2, atk: 3, mp: 4, name: "hogeman"));
55
+ Console.WriteLine(record); // name:hogeman, hp:1, mp:4, atk:3, def:2
56
+ }
57
+ }
58
+
59
+ record CharacterParams(string name, int hp, int mp, int atk, int def);
60
+
61
+ class Character
62
+ {
63
+ string name;
64
+ int hp;
65
+ int mp;
66
+ int atk;
67
+ int def;
68
+
69
+ public Character(string name, int hp, int mp, int atk, int def)
70
+ {
71
+ this.name = name;
72
+ this.hp = hp;
73
+ this.mp = mp;
74
+ this.atk = atk;
75
+ this.def = def;
76
+ }
77
+
78
+ // ValueTuple用
79
+ public Character((string name, int hp, int mp, int atk, int def) @params)
80
+ {
81
+ (name, hp, mp, atk, def) = @params;
82
+ }
83
+
84
+ // record用
85
+ public Character(CharacterParams @params)
86
+ {
87
+ (name, hp, mp, atk, def) = @params;
88
+ }
89
+
90
+ public override string ToString()
91
+ {
92
+ return $"name:{name}, hp:{hp}, mp:{mp}, atk:{atk}, def:{def}";
93
+ }
94
+ }
95
+ }
96
96
  ```