noutarins
@noutarins (nou tarins)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

なぜ、ほかのソースファイルで定義されているメソッドは、Classの中でなく、メソッドの中でしか使えないのですか?

解決したいこと

C# Unityです。
ものすごい初歩的な質問なのですが、なぜ、ほかのソースファイルで定義されているメソッドは、Classの中でなく、メソッドの中でしか使えないのですか?

該当するソースコード


public class a
{


    public void main()
    {
        b a-b = new b();
        a-b.Bmethod();
    }


}

上のコードだときちんとa-bが認識されているので、Bmethodメソッドを使えるのですが、

public class a
{

      b a-b = new b();
        a-b.Bmethod();

    public void main()
    {

    }


}

こちらだと、なぜかa-bが認識されていないらしく、Bmethodメソッドが使えません。

上のように、aクラスにて、bクラスのa-bメソッドを使いたいとき、「メインの外、aクラスの中」で使えないのはなぜですか?
わかりにくい質問だったらごめんなさい。

0

4Answer

# a-b が bクラスのインスタンスを受け取る変数ですか?
この変数のスコープが main()メソッドの中だからです。

new b() の結果をメソッド内のローカル変数ではなく、クラスのメンバ変数に格納するようにすれば他のメソッドでも使えるようになると思います。

1Like

Comments

  1. @noutarins

    Questioner

    ごめんなさい、質問がわかりにくかったです。編集して少しわかりやすくなったと思います良ければもう一度見ていただけるとありがたいです。
public class a
{
    b a_b = new b();

    public void main()
    {
        a_b.Bmethod();
    }

    public void sub()
    {
        //mainでもsubでもどっちでも使える
        a_b.Bmethod();
    }
}
1Like

Comments

  1. @noutarins

    Questioner

    ごめんなさい、質問がわかりにくかったです。編集して少しわかりやすくなったと思います良ければもう一度見ていただけるとありがたいです。
  2. 何故と言われてもC#の言語仕様でそう決まっているからです
  3. @noutarins

    Questioner

    他の方の回答でも教えていただきました。
    ありがとうございます。

「メインの外、aクラスの中」で使えないのはなぜですか?

それは「ほかのソースファイルで定義されているメソッド」に限った話ではありません。
C#のクラスの中でコードを書くことができるのは

  • メソッドの中
  • プロパティのgetsetの中
  • フィールド変数やプロパティの初期値(=の右辺)

に限られています。
たとえば

public class a
{
  int n = 0;

  Console.WriteLine("Hello!");
  n++;
}

と書くことができたとして、「Hello!」を出力させるにはどうすればいいでしょう?nが加算されるのはどういう時でしょう?
こんな書き方ができたとしても実行させる方法がないので無意味なんです。

1Like

Comments

  1. @noutarins

    Questioner

    なるほど、意味がないから実行できないようになっている。というのが正しいのですね。
  2. まったく逆ですw
    「(理由があって)実行できないようにしている」ではなく「(根本的な仕組みとして)実行させようがない」なのです。
  3. @noutarins

    Questioner

    いやもうほんとに毎回馬鹿でごめんなさいw
    いつもお世話になっております。
    ありがとうございます。

どのタイミングでメソッドが実行されることを想定されているのでしょうか?
他の回答者さんも述べているようにC#では(というか他の言語でもですが)classの中でメソッドに属していない場所に処理を記述するのは文法が間違っています。
もしインスタンス化した時に実行されることを期待するのでしたらコンストラクタの中で記述するのが正しいです。

class A {
    public A() {
        B b = new B();
        b.SomeMethod();
    }
}

あと質問自体とは関係のないことですが、C#は比較的コーディング規約が統一されているので、サンプルを載せるときは規約に従った形で記述されていると回答者が読みやすいと思います。
https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/coding-style/coding-conventions

少なくともクラス名が小文字なのと変数名に-があるのは読みにくいなと……
初見で減算かと誤読しました

1Like

Comments

  1. @noutarins

    Questioner

    ありがとうございます。完全独学故、こういったもの非常に助かります。

Your answer might help someone💌