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

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

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

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

Q&A

解決済

4回答

20100閲覧

C#で配列の宣言・初期化でnewする理由、クラスと型の違い

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

1グッド

1クリップ

投稿2018/12/02 15:40

(C#の絵本 第2版で勉強しています。)

配列を使用するときに、以下のようにnew を使って宣言(&初期化?)するようですが、

c#

1int[] array1 = new int[] {1,2,3,4};

一般の変数では

c#

1int a = 1;

newを使用しないので、同じint型なのに変数と配列で違いが生じる理由がわかりません。



また、Abcというクラスがあるとして、以下ではクラスAbcからabc1というインスタンスが生成されますが、

c#

1Abc abc1 = new Abc();

c#

1int[] array1 = new int[] {1,2,3,4};

このように並べてみると、構文がすごく似通っているので
クラス(ここではAbc)と型(ここではint[])が同じような働きであるように見えて混乱しています。
クラスと型の共通点、相違点について教えていただけると幸いです。

MMashiro👍を押しています

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

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

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

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

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

guest

回答4

0

こんにちは。

C#で取り扱えるデータは、全て何かしらの「型」に割り当てられます。ここで言う「型」とは、「コード中で取り扱うデータの性質を明らかにするためのラベル」を意味します。intだろうと、int[]だろうと、MyClassだろうと、変数に付ける「型」という意味では同じレイヤ上の存在です。
特殊なのは、intの「データ」の方です。intstringboolなどは「コード中に値を直接書くことで、そのデータのオブジェクトを入手できる」という特別な存在なのです。これを「リテラル」と呼びます。
newが「新しいデータ(オブジェクト)をその場で作成する」というものに対して、リテラルは「既に存在している(はずの)データを再発見する」というイメージで考えるとより近いです。(enumなどもこちらに近いです)
大多数の「型」(クラス、構造体、その他全て)はnewしないとオブジェクトを作ることが出来ないので、宣言とnewが一対一になっている解説が多いだけで、データさえ手に入るならnewを使わない手段でも構わないのです。よって、newしなくてもデータが手に入るintでは、newを使う必要がなかっただけなのです。

投稿2018/12/03 00:23

tamoto

総合スコア4119

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

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

退会済みユーザー

退会済みユーザー

2018/12/03 03:45

とても分かりやすい説明ありがとうございました!
guest

0

一般の変数では int a = 1; とnewを使用しないので、

プログラマが明示的に new を使用して初期化しなくても、コンパイラが内部的に初期化するので簡易的にそう書けるということだと思います。

詳しくは以下の記事の「値型の初期化」のセクションを見てください。

値型 (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/value-types#initializing-value-types

【追伸】

もう一つ、値型と参照型の違いを理解しているでしょうか? 理解が曖昧もしくは不十分ということであれば、以下の記事に目を通されると良いと思います。

2-3 値型と参照型
https://msdn.microsoft.com/ja-jp/library/cc406735.aspx

値型と参照型の区別と違い クラスと構造体の違い
http://dobon.net/vb/dotnet/beginner/valuereference.html

ちなみに、int は値型です。その配列 int[] やクラス Abc は参照型です。

投稿2018/12/03 00:56

編集2018/12/03 01:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/12/03 03:41

値型と参照型の違いももう少し勉強したいと思います。 ありがとうごさいました!
退会済みユーザー

退会済みユーザー

2018/12/03 03:43 編集

> 値型と参照型の違いももう少し勉強したいと思います。 むしろそちらの方を勉強するのが先だろう思われます。勉強、頑張ってください。
guest

0

クラスは型の1種です。
詳しくはこちらが分かりやすかったです
値型と参照型で取扱には微妙な差異(代入や引数時に何が複製されるか)がありますが
文法上大きな違いはなかったと思います。

同じint型なのに変数と配列で違いが生じる理由がわかりません。

すでに出ている通り、int[]int[]型でありint型ではありません。

int型に数字から数値を直接代入できるのはリテラルという機能です。

投稿2018/12/02 22:30

編集2018/12/02 22:36
asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2018/12/02 23:15

・配列、int等の変数(リンク先では「単純型」?)、クラスはどれも型であるので同じような扱い(newするなど)ができる ・int[]は 内容(=要素)がint型で表せる情報の 配列型であるのでintとは全くの別物(どちらも型ではある)である という理解でよろしいでしょうか。 またリンク先を拝見しましたが、「型」とは何であるのかがいまいちわかりません。 よろしければ、参考にできるページなどを教えていただけると幸いです。
guest

0

ベストアンサー

配列 (C# プログラミング ガイド)にあるように、配列型は、抽象基本型 Array から派生した参照型です。
この為、newにてインスタンスを生成する必要があります。

ただ、初期化の時は

C#

1int[] array1 = { 1, 2, 3, 4 };

と省略して記述することも可能です。

投稿2018/12/02 16:10

YAmaGNZ

総合スコア10286

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

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

退会済みユーザー

退会済みユーザー

2018/12/02 17:16

配列はArrayクラスから派生した機能であるから、クラスのようにnewでインスタンスを生成するという理解でよろしいでしょうか。 また、参照型であることと、newでインスタンス生成を行うことに関係はあるのでしょうか。 intは値型ですが、 int a = new int(); とnewでインスタンス生成することができるようですが…
YAmaGNZ

2018/12/02 22:25

intも突き詰めれば構造体です。ここであがっている「型」「配列」「クラス」は大雑把に考えると大きな違いはありません。 例にあげたように配列の場合でも宣言時の初期化の場合はnewを省略して記述できますし、おっしゃるようにintをnewすることもできます。 私も明確に説明できていませんが、リテラルとして記述できる場合はnewを使わなくても記述できるのではないかと思います。
退会済みユーザー

退会済みユーザー

2018/12/02 23:00

なんとなくですが配列の概念が理解できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問