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

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

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

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

Q&A

解決済

3回答

15386閲覧

staticメソッドから非staticメソッドを呼べますか?

otftrough

総合スコア476

C#

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

0グッド

0クリップ

投稿2016/05/23 11:31

Mainではないstaticメソッドから、非staticなSystem.Windows.Forms.LabelをつくったりControls.Add()したいんですが、やり方がわかりません。
Formを継承したクラスを使っていて、イメージとしてはこんな感じ(雑)

using System.Windows.Forms; class Hello : Form{ static void Main(){ Application.Run(new Hello("world")); } public Hello(string comeOn){ Width = 500; Height = 250; staticMethod(comeOn); } static void staticMethod(string LetsGo){ notStaticMethod(LetsGo); } private void notStaticMethod(string where){ Label label = new Label(); label.Text = "I'm in " + where + " now."; Controls.Add(label); } } /* Hello.cs(19,3): error CS0120: 静的でないフィールド、メソッド、またはプロパティ 'Hello.notStaticMethod(string)' で、オブジェクト参照が必要です Hello.cs(22,15): (以前のエラーに関連するシンボルの位置) */

普段はJavaを使ってるので、自分のインスタンス作ってできるかなーって思って

Hello hello; static void Main(){ hello = new Hello("world"); Application.Run(hello); } static void staticMethod(string LetsGo){ hello.notStaticMethod(LetsGo); }

こう書いたけどまたよくわからんエラーでダメでした。
どうすればいいんでしょう?

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

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

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

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

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

guest

回答3

0

staticはstaticで定義されているものでない限りアクセスできません。
解決策としては以下のものがあります。
0. staticメソッドに引数で対象となるインスタンスを渡す
0. staticなフィールドを用意してそれに対してアクセスする

投稿2016/05/23 11:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Javaと違って?そのようなことは出来ないようです。

静的メンバー - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

メソッドに対して static を付けると、 クラスに属するメソッドになります。 (静的メンバーにしかアクセスできなくなります。 メソッドからインスタンス フィールドなどにアクセスする必要が特にない場合には、静的メソッドにしておく方が実行効率がいい。)

用途としては、以下のような場合を想定しているようです。

数学関数や数学定数などのように、そもそもインスタンスを持つ必要のないものもあります。 この場合にも、静的メソッド・静的フィールド(あるいは別項で説明する「定数」)を使います。

ozwkさんが回答されたように「自身の中に定義されたメソッド」であれば、非staticのメンバーでもアクセスできるのでしょうが。

投稿2016/05/23 11:49

編集2016/05/23 11:56
pi-chan

総合スコア5936

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

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

0

ベストアンサー

C#

1public class Hello{ 2 static Hello hello; 3 static void staticMethod(string greeting){ 4 hello.notStaticMethod(greeting); 5 } 6 7 public static void Main(){ 8 hello = new Hello("world1"); 9 staticMethod("hello"); 10 } 11 12 string world; 13 public Hello(string world){ 14 this.world = world; 15 } 16 17 void notStaticMethod(string greeting){ 18 System.Console.WriteLine(greeting + " " + this.world); 19 } 20} 21

staticメソッドでやる意味が全く解らないですがこれで出来ます。

非staticなメソッドは「インスタンスに対する操作」なので、
当然どのインスタンスに対して行うかを指定しなければなりません。

ですので今回のようにインスタンスをstaticなメンバで持つか、
引数で渡すなりしてください。

投稿2016/05/23 11:46

編集2016/05/23 12:03
ozwk

総合スコア13512

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

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

otftrough

2016/05/23 12:24

ありがとうございます。 static Hello hello;の一行でほぼ解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問