82883


`Swift`だとstringやintはstuctで設計されており、基本的にstructを使って設計し、必要があればclassを使うのが正しいやり方?だと思っているのですが、`C#`では基本classなのでしょうか？

自分の考え的には、classは便利ですが、nullが許容されたり、参照渡しなので、そこを気を付けるのが大変だと思うのでstructを使うのがいいと思っています。

<https://techblog.kayac.com/trap-around-struct-in-csharp>

<https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/choosing-
between-class-and-struct>

structはメモリーを多く使ってしまう傾向があるからということでしょうか？


CC BY-SA 4.0
2021-10-05T05:09:39.313
82881
2021-10-05T13:21:40.360
40856
question
swift c#
C#のstructはSwiftのstructと同じように基本使わない形のほうがいいのでしょうか？


提示されているマイクロソフトドキュメントにあるように、基本的に class で実装するべきです。

> structはメモリーを多く使ってしまう傾向があるからということでしょうか？

struct の代入は全体のメモリーコピーになり、これが問題になります。  
たとえば struct のサイズが 1KB の場合、代入や関数で引数として渡すたびに 1KB のメモリーコピーが行われるため、そのコストがかかります。
class ですと、どんな class サイズであろうと 4byte (64bitアプリなら 8byte) になります。

容量としては、メモリーと言うか、スタックのほうが問題になります。  
関数の引数は基本的にスタックに積まれることになりますが、 struct を引数使用する場合には問題は深刻になります。  
どんなにメモリを積んでいてもスタックサイズは標準設定では 1MB (環境による) なので、もしすべてを struct にした場合、あっという間に
StackOverflowException が発生します。

方針としては、すべて class で実装し、パフォーマンスのネックになる場合に限りドキュメント通り以下の原則を元に実装することをおすすめします。

  * プリミティブ型 (int、double など) と同様に、論理的に単一の値を表す。
  * インスタンスのサイズが 16 バイト未満である。
  * 不変である。
  * 頻繁にボックス化する必要がない。

* * *

>
> 自分の考え的には、classは便利ですが、nullが許容されたり、参照渡しなので、そこを気を付けるのが大変だと思うのでstructを使うのがいいと思っています。

class の使用方法に慣れてください。参照渡しが基本であるという考え方をしたほうがいいです。すべてのフレームワークが class を主に実装されています。  
関数に class のインスタンスを渡して、その関数内でインスタンス内容が変化する、という実装はそれが目的でない限りほとんどありません。

「不変(Immutable)」という発想も覚えておくと良いと思います。  
コンストラクタでのみ値を設定し、以後変更を許さないという発想です。変更されないことが保証されるため、とても扱いやすくなります。  
例としては、string クラスがこれにあたります。

nullを許容したくない場合、C# 8.0 以降では [null 許容参照型](https://docs.microsoft.com/ja-
jp/dotnet/csharp/nullable-references) の機能を有効にすることでコンパイラレベルで制限することが可能です。


CC BY-SA 4.0
2021-10-05T07:01:48.077
82883
2021-10-05T07:01:48.077
14817
82881
answer


  * 文法的に制約が多い。（継承、デストラクタが使えない、コンストラクタが扱いにくい等）
  * 受け渡しのオーバーヘッドが大きい。
  * そもそも.NETのライブラリ自体がほぼclassベースなので、classを使う事は避けられない。

Blittableなstructは単純なメモリコピーで複製出来るので、他言語・他プロセスとのデータ相互運用には便利ですが、逆に言えば、それ以外で使う事が殆ど無いです。  
C#という言語の利便性を損なうので、特別な理由が無ければ、敢えてstructを使う必要性を感じないです。


CC BY-SA 4.0
2021-10-05T12:57:06.517
82890
2021-10-05T13:21:40.360
2021-10-05T13:21:40.360
41943
41943
82881
answer