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

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

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

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

Q&A

解決済

4回答

12016閲覧

Mainメソッドにstaticがついてる理由 and staticがついてるメソッドから、staticがついていないメソッドが呼び出せない理由

N---------

総合スコア46

C#

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

0グッド

0クリップ

投稿2018/05/26 14:48

編集2018/05/26 14:52

c#にて、mainメソッドにstaticがついてるのはなぜでしょうか?

 また、「staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない」という文章を読みました。なぜ呼び出してはいけないのですか?
また、別のクラスで定義したメソッドは、staticをつけなくても、(staticがついている)Mainメソッド内で呼び出せました。なぜstaticがついているメソッドからstaticがついていないメソッド呼び出せたのですか?

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

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

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

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

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

N---------

2018/05/27 12:07

Mainにstaticがついている理由は、次のような理解で大丈夫ですか。Mainメソッドが定義されてるProgramクラスは、インスタンス化されずに実行される。また、インスタンス化されることもないのでstaticを付けている。
guest

回答4

0

c#にて、mainメソッドにstaticがついてるのはなぜでしょうか?

Main メソッドはプログラムのエントリポイントで、エントリーポイントは静的 (static) メソッドでなければならないという取り決めがあるからです。

詳しくは以下の記事の「Main の引数、戻り値」のセクションを見てください。

[雑記] エントリーポイント
http://ufcpp.net/study/csharp/structured/miscentrypoint/

また、「staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない」という文章を読みました。なぜ呼び出してはいけないのですか?

何を見たのか分かりませんが(参考にした記事の url を書くようにしてくださいね)、それは誤解だと思います。

「staticのついていないメソッド」=「インスタンスメソッド」ですが、そのメソッドが定義されているクラスを初期化してインスタンス化すれば当然のことながら呼び出すことはできます。

投稿2018/05/27 00:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pepperleaf

2018/05/27 00:33

> 「staticのついていないメソッド」=「インスタンスメソッド」 これは当然ですが、インスタンスがなんであるか理解している前提ですね。この説明がちょっと難しい、、。 その辺を端折ると、 > staticがついているメソッドから、staticのついていないメソッド となるかもと思っています。また、Webとかで、よく見る記述でもあります。
退会済みユーザー

退会済みユーザー

2018/05/27 00:57

質問者さんが「インスタンスって何?」とか聞いてきたら答えます。それ以前にインスタンスの説明をするのは回答として冗長すぎると思ってます。
guest

0

非staticメソッドはオブジェクト毎に紐づきます。ですので、オブジェクトに数が100個ならば100個にそれぞれ割り当てがあります。

一方、staticメソッド、フィールドはオブジェクトに紐づきません。クラスにおいて共有で使われるためです。オブジェクトの数が複数でも0でも関係なく1つずつです。ですので、staticメソッドで非staticメソッドを呼び出そうとすると、どのオブジェクトのものを呼び出せばいいかわかりません。

逆に、非staticメソッドからstaticメソッドは呼び出せます。一つしかないからです。

投稿2018/05/26 15:00

HogeAnimalLover

総合スコア4830

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

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

退会済みユーザー

退会済みユーザー

2018/05/27 00:14

> staticメソッドで非staticメソッドを呼び出そうとすると、どのオブジェクトのものを呼び出せばいいかわかりません。 「非staticメソッド」=「インスタンスメソッド」のことであれば、インスタンスに紐づいているので、<インスタンスへの参照>.<インスタンスメソッド> で呼び出せますし、「どのオブジェクトのものを呼び出せばいいかわかりません」ということはないはずですが?
退会済みユーザー

退会済みユーザー

2018/05/27 00:23

余談ですが、static メソッドでも、インスタンスメソッドにおける「どのオブジェクトのものを呼び出せばいいかわかりません」と似たようなことはあると思います。例えば、Math クラスの static メソッドの呼び出しは、Math.<メソッド> になります。
HogeAnimalLover

2018/05/27 03:17

? 対象オブジェクトを指定する記述ならstaticメソッドから非staticメソッド呼び出すこともできるはずです。ただ、その場合、そもそもstaticメソッドにする意味がわかりませんけど?
退会済みユーザー

退会済みユーザー

2018/05/27 03:47

上のコメントの意図が読み取れないので外しているかもしれませんが・・・ 「staticメソッドにする意味」というところに注目してレスしますと、クラスを初期化してインスタンス化する必要ないメソッドは static にする意味はあると思います。 例えば、上のコメントに書いた Math クラスを例にとると、メソッドによる計算結果を得るために、Math クラスをインスタンス化するという無駄なことは全く必要ないので、Math クラスのメソッドは全て static になっていると思ってます。
guest

0

ベストアンサー

簡単に言うと、
static をつけた関数というのは、new で生成しなくても使うことができるから、ですね
main関数のように、最初にとにかく実行(読み出し)しなくてはならないものにはstatic つけないと動かせることはできませんな。


また、「staticがついているメソッドから、staticのついていないメソッドを呼び出すことはできない」という文章を読みました。なぜ呼び出してはいけないのですか?

呼び出そうと思えば呼び出せます
それには、その(staticがついてない)メソッドが属するクラスを new して、その上で呼び出す必要があります
staticがついてないメソッドを直接呼び出すことができない、というのが正確ですねー

投稿2018/05/27 00:06

編集2018/05/27 00:10
y_waiwai

総合スコア87774

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

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

0

マイナス評価するのに理由を求められるシステムだったので回答として記入

静的メソッドから、同じクラスの静的メソッドではないメソッドを呼び出そうとする場合にも、同じ問題が起きます(中略)この場合静的メソッドであるStaticMeth()の中から、静的メソッドではないメソッド(つまり、インスタンスメソッド)であるNonStaticMeth()を呼び出そうとすると、コンパイルエラーとなります。

[独習C#第3版 pp.238-239]

こういうことを言ってんじゃないかと思います。この本では回答は、

ただし、次の点に注意してください。静的メソッドは、そのクラスの特定のインスタンスメソッドを呼び出すことも(中略)できます。ただし、それを行うためには必ずそのクラスの特定のオブジェクトインスタンスを使わなければなりません。

[同書 p.239]

のように続きに、SurferOnWwwさんやy_waiwaiさんが書いておられることが書いてあります(よほどの資料でないかぎりそのような断りがあると推測します。万一書いてないなら、その資料は即刻破棄すべき)

投稿2018/05/29 05:05

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問