回答編集履歴

1

見直しキャンペーン中

2023/07/28 15:09

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,191 +1,96 @@
1
1
  注)私はUnityに詳しくないので、mori.heyさんの環境で使用できるのかはわかりません。
2
-
3
-
4
2
 
5
3
  > Unity内のC#で引数を渡す際に,Pythonのようにリストや辞書をアンパックして渡したいです.
6
4
 
7
-
8
-
9
5
  なぜタプルが出てこないのかという気がしますが、C#にも`ValueTuple`というものがあります。
10
6
 
11
-
12
-
13
7
  [タプル型 - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/value-tuples)
14
-
15
8
  [タプルとその他の型の分解 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/functional/deconstruct)
16
-
17
-
18
9
 
19
10
  これを利用すれば、ほぼ同じような使用感になるんじゃないでしょうか。
20
11
 
21
12
 
22
-
23
-
24
-
25
13
  本当は`record`が使えればいうことないんですが、これはまだ使えないんでしょうね^^;
26
-
27
14
  [C# 9.0 の新機能 - C# ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9#record-types)
28
-
29
15
  [レコード型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/datatype/record/)
30
16
 
31
-
32
-
33
17
  Unityではありません。コンソールアプリです。
34
-
35
- ```C#
18
+ ```cs
36
-
37
19
  using System;
38
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
39
30
 
40
-
41
- namespace Questions352883
31
+ // あくまで順番しか見ない。名前を付けたところで順番が変わるわけでも名前を間違えても関係ない
42
-
43
- {
44
-
45
- class Program
46
-
47
- {
48
-
49
- static void Main()
50
-
51
- {
52
-
53
- // ValueTuple
32
+ // ※警告はでるので間違いに気が付かないというわけではない。
54
-
33
+ // 警告 CS8123 ターゲット型 '(string name, int hp, int mp, int atk, int def)' によって異なる名前が指定されている、または名前が何も指定されていないため、タプル要素名 '○○' は無視されます。
55
- var valueTuple = new Character(("hogeman", 1, 2, 3, 4));
34
+ valueTuple = new Character(("hogeman", mp: 1, hp: 2, hoge: 3, 4));
56
-
57
35
  Console.WriteLine(valueTuple); // name:hogeman, hp:1, mp:2, atk:3, def:4
58
36
 
59
37
 
60
-
61
- // あくまで順番しか見ない。名前を付けたところで順番が変わるわけでも名前を間違えても関係ない
62
-
63
- // ※警告はでるので間違いに気が付かないというわけではない。
64
-
65
- // 警告 CS8123 ターゲット型 '(string name, int hp, int mp, int atk, int def)' によって異なる名前が指定されている、または名前が何も指定されていないため、タプル要素名 '○○' は無視されます。
66
-
67
- valueTuple = new Character(("hogeman", mp: 1, hp: 2, hoge: 3, 4));
68
-
69
- Console.WriteLine(valueTuple); // name:hogeman, hp:1, mp:2, atk:3, def:4
70
-
71
-
72
-
73
-
74
-
75
38
  // record
76
-
77
39
  var record = new Character(new CharacterParams("hogeman", 1, 2, 3, 4));
78
-
79
40
  Console.WriteLine(record); // name:hogeman, hp:1, mp:2, atk:3, def:4
80
41
 
81
-
82
-
83
42
  // コンパイルエラー
84
-
85
43
  // 「名前付き引数」のルールを守らないとコンパイルできないので間違いようがない
86
-
87
44
  // [名前付き引数と省略可能な引数 - C# プログラミング ガイド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#named-arguments)
88
-
89
45
  // [オプション引数・名前付き引数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/sp4_optional.html#named)
90
-
91
46
  //record = new Character(new CharacterParams("hogeman", mp: 1, hp: 2, hoge: 3, 4));
92
-
93
47
  //record = new Character(new CharacterParams("hogeman", mp: 1, hp: 2, hoge: 3, hp: 4));
94
-
95
48
  //record = new Character(new CharacterParams("hogeman", hp: 1, hp: 2, atk: 3, def: 4));
96
-
97
49
  //record = new Character(new CharacterParams(1, 2, 3, 4, name: "hogeman"));
98
50
 
99
-
100
-
101
51
  record = new Character(new CharacterParams("hogeman", 1, def: 2, atk: 3, mp: 4));
102
-
103
52
  Console.WriteLine(record); // name:hogeman, hp:1, mp:4, atk:3, def:2
104
53
 
105
-
106
-
107
54
  record = new Character(new CharacterParams(hp: 1, def: 2, atk: 3, mp: 4, name: "hogeman"));
108
-
109
55
  Console.WriteLine(record); // name:hogeman, hp:1, mp:4, atk:3, def:2
110
-
111
56
  }
112
-
113
57
  }
114
-
115
-
116
58
 
117
59
  record CharacterParams(string name, int hp, int mp, int atk, int def);
118
60
 
119
-
120
-
121
61
  class Character
122
-
123
62
  {
124
-
125
63
  string name;
126
-
127
64
  int hp;
128
-
129
65
  int mp;
130
-
131
66
  int atk;
132
-
133
67
  int def;
134
68
 
135
-
136
-
137
69
  public Character(string name, int hp, int mp, int atk, int def)
138
-
139
70
  {
140
-
141
71
  this.name = name;
142
-
143
72
  this.hp = hp;
144
-
145
73
  this.mp = mp;
146
-
147
74
  this.atk = atk;
148
-
149
75
  this.def = def;
150
-
151
76
  }
152
77
 
153
-
154
-
155
78
  // ValueTuple用
156
-
157
79
  public Character((string name, int hp, int mp, int atk, int def) @params)
158
-
159
80
  {
160
-
161
81
  (name, hp, mp, atk, def) = @params;
162
-
163
82
  }
164
83
 
165
-
166
-
167
84
  // record用
168
-
169
85
  public Character(CharacterParams @params)
170
-
171
86
  {
172
-
173
87
  (name, hp, mp, atk, def) = @params;
174
-
175
88
  }
176
89
 
177
-
178
-
179
90
  public override string ToString()
180
-
181
91
  {
182
-
183
92
  return $"name:{name}, hp:{hp}, mp:{mp}, atk:{atk}, def:{def}";
184
-
185
93
  }
186
-
187
94
  }
188
-
189
95
  }
190
-
191
96
  ```