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

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

ただいまの
回答率

90.48%

  • C#

    7487questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 4,624

otftrough

score 329

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);
}


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

staticはstaticで定義されているものでない限りアクセスできません。
解決策としては以下のものがあります。

  1. staticメソッドに引数で対象となるインスタンスを渡す
  2. staticなフィールドを用意してそれに対してアクセスする

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

public class Hello{
    static Hello hello;
    static void staticMethod(string greeting){
        hello.notStaticMethod(greeting);
    }

    public static void Main(){
        hello = new Hello("world1");
        staticMethod("hello");
    }

    string world;
    public Hello(string world){
        this.world = world;
    }

    void notStaticMethod(string greeting){
        System.Console.WriteLine(greeting + " " + this.world);
    }
}

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/23 21:24

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

    キャンセル

0

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

  • 解決済

    javaのclassをまとめたい

    質問内容 eclipseを使用してjavaのマルチスレッド(3つ)を作る課題をやっているんですが,現段階ではスレッドごとにクラスを作り処理を行っています。 最終的には一つのクラ

  • 解決済

    Taskが実行されません。

    ネットで、ThreadよりTaskを使ったほうが良いという記事を見て、コピペで使ってみましたが、動きません。 MSDNを見ても、同じようなコードがあったのでこれでいいのかなーと思

  • 解決済

    Webサイトのxmlコードを読み取るプログラム開発

    windows form applicationで、webサイトのxmlコードを読み込むプログラムを作りたいと考えていますが、どのように作ればよいか大まかにでも教えていただきたいと

  • 解決済

    CのDLLをC#で使用した時の標準出力について

    お世話になります。  Cで作ったDLLをC#で使用についてお聞きしたいです。 DLL側にてprintf関数を使用し標準出力している部分があります。 そこで表示している文字

  • 解決済

    Xamarin.forms Labelで複数行かつ「...」を表示させる方法ありますか?

    こんにちは。 Xamarin.formsのLabelコントールについて質問です。 Labelで表示するテキストを複数行表示させるためには、 LabelのLineBreak

  • 解決済

    VBScriptのボタン

    vbscriptをつかってシャットダウンをさせたいと思っています。 現在のソースはこちら Msg = MsgBox("シャットダウンしますか?", vbYesNo + 

  • 解決済

    C# CoincheckのAPIを実行したい。

    お世話になります。 C#の勉強をしたいと思い 下記のサイトより https://kokenji.net/coincheck-api/ コードを拝借してAPIを実行してみまし

  • 解決済

    CS103:現在のコンテキスト内に存在しません。

    C# を現在VisualStudio を使わずに書いています。 プロジェクトには以下のファイルがあります。 main.cs Form1.cs ←どちらもクラス名は同

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

  • C#

    7487questions

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