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

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

ただいまの
回答率

90.52%

  • C#

    7111questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 294

N---------

score 14

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • N---------

    2018/05/27 21:07

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

    キャンセル

回答 4

+2

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/27 09:33

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

    キャンセル

  • 2018/05/27 09:57

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

    キャンセル

checkベストアンサー

+1

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/27 09:14

    > staticメソッドで非staticメソッドを呼び出そうとすると、どのオブジェクトのものを呼び出せばいいかわかりません。

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

    キャンセル

  • 2018/05/27 09:23

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

    キャンセル

  • 2018/05/27 12:17



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

    キャンセル

  • 2018/05/27 12:47

    上のコメントの意図が読み取れないので外しているかもしれませんが・・・

    「staticメソッドにする意味」というところに注目してレスしますと、クラスを初期化してインスタンス化する必要ないメソッドは static にする意味はあると思います。

    例えば、上のコメントに書いた Math クラスを例にとると、メソッドによる計算結果を得るために、Math クラスをインスタンス化するという無駄なことは全く必要ないので、Math クラスのメソッドは全て static になっていると思ってます。

    キャンセル

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7111questions

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

  • トップ
  • C#に関する質問
  • Mainメソッドにstaticがついてる理由 and staticがついてるメソッドから、staticがついていないメソッドが呼び出せない理由