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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

9777閲覧

c#において、他のファイルに記述したクラスの参照はどのように行われるのか

nishi835

総合スコア15

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/02/26 16:34

お世話になります。

C#初心者、というよりプログラミング初心者です。
UnityでC#を書いているのですが、以下のような記述のみで
他のファイルに記述したクラス(Charactor)を利用できるのが不思議だったので、
どのような仕組みで動いているのか知りたいです。

C#

1using UnityEngine; 2 3public class Enemy : MonoBehaviour 4{ 5 private Charactor charactor; 6 7 void Start() { 8 charactor = GetComponent<Charactor>(); 9}

情報が少なすぎるようでしたら、お手数ですがご指摘ください。
よろしくお願いいたします。

Unity 2018.3.4f1
エディタ:VSCode

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

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

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

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

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

guest

回答3

0

ベストアンサー

複数のファイルをまとめてコンパイルするので何の不思議もありません。
コンパイラにとっては EnemyCharacter もどちらも知っている型ですから相互に使うことができます。

C++ でそれができないのは言語仕様で制限されているからです。
参考: 前方宣言

これはもともと C 言語の仕様で、高速化と使用メモリ抑制のためにファイルを前から順に処理して、処理した順に出力を確定できるよう決められたものだと思います。貧弱な環境でコンパイルするために言語の方が歩み寄った形でしょうね。その資産を受け継ぎ、シンボルをファイルの後ろで書き換えるようなコードをコンパイルするために今でもこの仕様が採用されています。

C# の場合はメソッドやクラスをファイルの前で宣言しても後ろで宣言しても全く意味は変わりませんが、C および C++ の場合は意味が変わります。そのため、別ファイルで宣言されたものを現在のファイルの前に読み込むために #include が使われます。

また、C# での using には複数の意味がありますが、ここで使われている using は名前空間を省略するためのものです。
例えば、System.UnityEngine.MonoBehavior といちいち書く代わりに MonoBehavior と書けるのは using System.UnityEngine しているからです。

#include はファイルを読み込むためのものなので、必要なクラスを使うには必ず必要となりますが、これと違い、using は使わなくても構いません。必要なファイルはプロジェクトファイルによって既にコンパイラに指示されているので、クラス名を名前空間から書けば使用できます。

投稿2019/02/26 20:32

Zuishin

総合スコア28660

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

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

nishi835

2019/02/26 21:53

詳細かつ分かりやすい回答ありがとうございます。 理解が深まりました。
guest

0

C言語では、ファイルをアタマから順に読み込んでいって、定義されたキーワードを覚えて、文にキーワードがでたら覚えてるやつを使って解釈していく、という単純明快な解釈方法。
使うメモリも少なくて済む上に、ファイルを読み込むのは一度だけで済むので高速に処理できる
(あくまで概念上の解釈で実際には一度だけの読み込みのみというのはどうだかわからんが)

さて、時代は流れてCPUの機能は上がりメモリもGバイト積むのが当然になってくると、メモリの節約?高速?それなにがおいしいの?という時代になってくると、

プロジェクトに登録されてるファイル、参照されてるライブラリを一切合切全部読み込んで、登場するキーワードを全部登録、改めてもう一度ソースを読み込んで解釈する、というメモリもじゃんじゃん使って、CPUパワーもじゃぶじゃぶ使うという処理のほうが便利じゃね?ということになってきて、そういう処理系が出てきたってことですね

まあ、これがC#なんですけどねー

投稿2019/02/27 01:25

y_waiwai

総合スコア87774

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

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

nishi835

2019/02/27 02:26

ご回答ありがとうございます。 ちなみに、ファイルの追跡対象の範囲はどのように決まっているのでしょうか。.slnと同じディレクトリに移動させたら、追跡対象外となりましたが、これはVSCodeなどのエディタが判断しているのでしょうか。
MMashiro

2019/02/27 11:04

> ファイルの追跡対象の範囲はどのように決まっているのでしょうか。 基本的には.csprojに記述されているファイルがコンパイル対象になり、それ以外のファイルは対象外になります。VisualStudioで.csを追加したら自動で.csprojにそのファイルのパス等が書き込まれています。 但しUnityでは自動的にプロジェクトフォルダ以下のファイルをすべて見て自動で.csprojを生成するため挙動が少し異なる点に注意が必要です。
y_waiwai

2019/02/27 11:09

プロジェクトに登録されているファイル、参照されるライブラリ、とあるように、プロジェクトに登録されてるかどうかですね。同じフォルダにあっても登録されてなければ解釈されません
guest

0

真面目に答えると面倒です。
プログラムはどのように動くのか?とか、コンパイラとかそういう話になりますので。

名前空間というので管理されているぐらいは知っていていいと思います。
https://ufcpp.net/study/csharp/sp_namespace.html

また、Dllを参照する形で使えるようにしたりします。

基本的には、ちょっと変なことをしてトラブルになるまでは、深く考える必要がないことだと思います。
それだけ便利に作られているということです。

投稿2019/02/26 16:52

編集2019/02/26 16:55
kiichi54321

総合スコア1984

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

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

nishi835

2019/02/26 17:22

ご回答ありがとうございます。 おっしゃる通り、とりあえずあまり気にする必要はない気もするのですが、プログラミングの相方が気にしていたこともあり、自分も気になって質問させていただきました。 名前空間に関しましては、クラス名が衝突しないようにする仕組み、ぐらいの認識で理解しています。 ただ、上の例ではnamespaceの定義とか、using hogeのような記述がなくても動いているので、気になった次第です。 C++などでは、#include hoge.cppとかいうように、明示的に書いていたので…。 その辺りはコンパイラ(?)が自動的に解釈してくれている、というような認識でいいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問