回答編集履歴

5

書式不備修正

2024/02/26 04:47

投稿

juner
juner

スコア142

test CHANGED
@@ -33,6 +33,8 @@
33
33
  ```
34
34
 
35
35
  ## 蛇足
36
+ 配列ならこう
37
+ ```csharp
36
38
  using System;
37
39
  MyStruct[] list = [ new("a"), new("b"), new("c")];
38
40
 

4

ref 戻り値なら直接変更しても問題無い為、直接変更する様に修正

2024/02/26 04:46

投稿

juner
juner

スコア142

test CHANGED
@@ -12,12 +12,11 @@
12
12
 
13
13
  // 内部配列を取得
14
14
  var span = CollectionsMarshal.AsSpan(list);
15
- // 参照変数にする
16
- ref var s = ref span[0];
17
15
  // 変更
18
- s.Name = "MyStruct42";
16
+ span[0].Name = "MyStruct42";
19
17
 
20
18
  Console.WriteLine($"[{string.Join(", ", list)}]");
19
+
21
20
 
22
21
  struct MyStruct {
23
22
  public MyStruct(string name) => Name = name;
@@ -25,7 +24,7 @@
25
24
  public override string ToString() => $"{nameof(MyStruct)}{{ {nameof(Name)} = {Name}}}";
26
25
  }
27
26
  ```
28
- [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQcAMACOSAsA3OlrkgHQBK0wAlgLYCm5AklMI2APYAOAypwButAMaMAzsTQAZWuOAAeALIBPPsEgjgAPmwAbOcGwBebAG1sURgHcAFACIAhvYCUAGks2HAI1cerdvYirgC6UiRIAJy2ACT2ZgDeeJjkAFJctFAOHvYeBvIuAL4hruFoAPTl2IChioAXCYCyiYDoSoBJDIBryoDp+uiCjmDY4jyOUCbYAMJcenqMWrRcUOJKPeIAFo565ACC4nwDWfnALlKV2IBDyoDmjoCQmoAOpoDWDICaDIDRDOhgjABm2N294sPPb/2DZpgwugjudAC9m6HE5AAco4mMN7Kp1JpgPgEPYynhonFEsk0hksrlsIS9kUSgd0BS0BCNBAtNhETS6Ql0NhWbgAMz0tSM4C2ZKWWGMFwmXQwuGmKCCqRsjlkHBixjStlwTlcQScMC0AAmjDl2AAKlwkZkAOa2YXGXRxBKSphcF62BnIooJBLYG2C+22BVFYYJBWFQPo9CFIA==)
27
+ [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQcAMACOSAsA3OlrkgHQBK0wAlgLYCm5AklMI2APYAOAypwButAMaMAzsTQAZWuOAAeALIBPPsEgjgAPmwAbOcGwBebAG1sURgHcAFACIAhvYCUAGks2HAI1cerdvYirgC6UiRIAJy2ACT2ZgDeeJjkAFJctFAOHvYeBvIuAL4hruFoAPTl2IChioAXCYCyiYDoSoBJDIBryoDp+uiCjmDY4jyOUCbYAMJcenqMWrRcUOJKPeIAFo565ACC4nwDWfnALlKV2ICQmoAvZuj9g2aYIeQAco5Mw/aq6prA+Aj2ZXjRcYnJNIZLK5bCgvZFEoHdAwtDyd7YV4aCBabAJdDYTG4ADMiLUyK0tmSlkejBcJl0DyepigpKkWJxZBwVMY9KxcFxXEEnDAtAAJowmdgACpcN6ZADmtnJxl0cQStKYXAAZrYke8igkEmjFYwVbYWUVhgkWYUzd90IUgA==)
29
28
 
30
29
  ## 実行結果
31
30
  ```text
@@ -34,17 +33,13 @@
34
33
  ```
35
34
 
36
35
  ## 蛇足
37
- 配列ならこう
38
- ```cs
39
36
  using System;
40
37
  MyStruct[] list = [ new("a"), new("b"), new("c")];
41
38
 
42
39
  Console.WriteLine($"[{string.Join(", ", list)}]");
43
40
 
44
- // 参照変数にする
45
- ref var s = ref list[0];
46
41
  // 変更
47
- s.Name = "MyStruct42";
42
+ list[0].Name = "MyStruct42";
48
43
 
49
44
  Console.WriteLine($"[{string.Join(", ", list)}]");
50
45
 
@@ -55,4 +50,4 @@
55
50
  }
56
51
  ```
57
52
 
58
- [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQBZAngZWJAY2AG0BdAAgBsBLAZ2HIF5zjyoBTAdwAoAiAQ14BKADRsufAEbCxHHrwLDSAbnTo4SAJzcAJL2IBvDQAYAdACkA9tSh8xvMTXpCAvqWGq06APTfygIeVAc0dASE1AB1NAawZATQZAaIZ0MHYAM3IAN34wclomcnikpxJjFR8/YMAXs3RaUwA5fgBbdizebDxCYAAWBF5PdS1dfSMkMysbO3IHKjpgV3chLrR6FvIm/AgicgN0ck3yOABmRdxlom4TNlr2ISYAPnJquqyoM88t7b2T2/Ynrd3yS2T2MDA1AAJvUTgAVSzNGwAc24F0Y1z0BgedUsCW4SxargMBjWKPYaO471cWQM7xcFM66BcQA)
53
+ [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQBZAngZWJAY2AG0BdAAgBsBLAZ2HIF5zjyoBTAdwAoAiAQ14BKADRsufAEbCxHHrwLDSAbnTo4SAJzcAJL2IBvDQAYAdACkA9tSh8xvMTXpCAvqWGq06APTfygSE1AF7N0JxJjUlMAOX4AW3Ymcl5sPEJgABYEXk91LV19IyQzKxs7RMc6YFd3IWy0elTyZPwIInIDdHJO8jgAZkbcZqJuEzZY9iEmAD5yaLiEqDHPLu6+kdn2Ja7e8ksAN3YwMGoAE3iRgBVLFJsAc24Jxmm9AwW4ywAzbibU1wMDNte7A+3HWrgSBnWLihWXQLiAA)

3

構造隊→構造体

2024/02/15 10:00

投稿

juner
juner

スコア142

test CHANGED
@@ -1,4 +1,4 @@
1
- MyStruct は構造(=値型) なので、`list[0].Name` の段階で `list[0]` からのコピーの `MyStruct.Name` が呼ばれている為、そこに代入しても意味が無いというエラーです。
1
+ MyStruct は構造(=値型) なので、`list[0].Name` の段階で `list[0]` からのコピーの `MyStruct.Name` が呼ばれている為、そこに代入しても意味が無いというエラーです。
2
2
 
3
3
  `list[0]` を直接修正したい場合は次の様に [`CollectionsMarshal.AsSpan()`](https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.collectionsmarshal.asspan?view=net-8.0) すると `List<T>` の内部配列を取得でき、そこから インデクサアクセスにより `list[0]` 内の参照が取得できる為、戻し忘れみたいなこともないのでおすすめします。(こういう時に配列を使うと `list[0]` がref 戻り値なので直接 参照が取得できるので楽でもあります。
4
4
 

2

配列の場合のコードを追加

2024/02/15 08:12

投稿

juner
juner

スコア142

test CHANGED
@@ -32,3 +32,27 @@
32
32
  [MyStruct{ Name = a}, MyStruct{ Name = b}, MyStruct{ Name = c}]
33
33
  [MyStruct{ Name = MyStruct42}, MyStruct{ Name = b}, MyStruct{ Name = c}]
34
34
  ```
35
+
36
+ ## 蛇足
37
+ 配列ならこう
38
+ ```cs
39
+ using System;
40
+ MyStruct[] list = [ new("a"), new("b"), new("c")];
41
+
42
+ Console.WriteLine($"[{string.Join(", ", list)}]");
43
+
44
+ // 参照変数にする
45
+ ref var s = ref list[0];
46
+ // 変更
47
+ s.Name = "MyStruct42";
48
+
49
+ Console.WriteLine($"[{string.Join(", ", list)}]");
50
+
51
+ struct MyStruct {
52
+ public MyStruct(string name) => Name = name;
53
+ public string Name;
54
+ public override string ToString() => $"{nameof(MyStruct)}{{ {nameof(Name)} = {Name}}}";
55
+ }
56
+ ```
57
+
58
+ [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQBZAngZWJAY2AG0BdAAgBsBLAZ2HIF5zjyoBTAdwAoAiAQ14BKADRsufAEbCxHHrwLDSAbnTo4SAJzcAJL2IBvDQAYAdACkA9tSh8xvMTXpCAvqWGq06APTfygIeVAc0dASE1AB1NAawZATQZAaIZ0MHYAM3IAN34wclomcnikpxJjFR8/YMAXs3RaUwA5fgBbdizebDxCYAAWBF5PdS1dfSMkMysbO3IHKjpgV3chLrR6FvIm/AgicgN0ck3yOABmRdxlom4TNlr2ISYAPnJquqyoM88t7b2T2/Ynrd3yS2T2MDA1AAJvUTgAVSzNGwAc24F0Y1z0BgedUsCW4SxargMBjWKPYaO471cWQM7xcFM66BcQA)

1

インデクサアクセスの旨の文言の追加

2024/02/15 08:10

投稿

juner
juner

スコア142

test CHANGED
@@ -1,6 +1,6 @@
1
1
  MyStruct は構造隊(=値型) なので、`list[0].Name` の段階で `list[0]` からのコピーの `MyStruct.Name` が呼ばれている為、そこに代入しても意味が無いというエラーです。
2
2
 
3
- `list[0]` を直接修正したい場合は次の様に [`CollectionsMarshal.AsSpan()`](https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.collectionsmarshal.asspan?view=net-8.0) すると `list[0]` 内の参照が取得できる為、戻し忘れみたいなこともないのでおすすめします。(こういう時に配列を使うと `list[0]` がref 戻り値なので直接 参照が取得できるので楽でもあります。
3
+ `list[0]` を直接修正したい場合は次の様に [`CollectionsMarshal.AsSpan()`](https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.collectionsmarshal.asspan?view=net-8.0) すると `List<T>` の内部配列を取得でき、そこから インデクサアクセスにより `list[0]` 内の参照が取得できる為、戻し忘れみたいなこともないのでおすすめします。(こういう時に配列を使うと `list[0]` がref 戻り値なので直接 参照が取得できるので楽でもあります。
4
4
 
5
5
  ```csharp
6
6
  using System;