2016-08-01 15 views
0

nameCheckの方法では、入力があるかどうかを確認するだけです。プライベートメソッドから静的メソッドに変数を取得する方法は?

最初に私はstaticに方法を変更しようとpublic可変としたが、その後、私はメインのメソッドがそうnameが働くことができないstaticあるので、それが動作することはできません実現。私はネットを検索し、nameCheckを使用するオブジェクトがないので、それを解決しました。

今、私は私のMain方法でstringに方法nameCheckstringを取得する方法がわかりません。あなたはあなたの方法 "nameCheck" に

を自分の価値観を返す必要が

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Hallo, wie heißt du?"); 
      string name = Console.ReadLine(); 

      Program a = new Program(); 
      a.nameCheck(name); 

      Console.WriteLine("Hallo " + name); 


      Console.ReadLine(); 
     } 
     private void nameCheck(string n) 
     { 
      if (n == "") 
      { 
       Console.WriteLine("Geben Sie einen Namen ein"); 
       n = Console.ReadLine(); 
      } 
     } 
    } 
+3

プライベートメソッドも静的にして、メインメソッドから呼び出すだけです。プログラムの新しいインスタンスを作成する必要はありません。 –

+4

あなたがここでやろうとしていることは本当に明確ではありません。私はあなたのロジックを再考する必要があると思います、あなたがやっていることはおそらく難しいことではありません。 C#チュートリアルを最初に実行するだけでよいでしょうか? – DavidG

+0

ここのコードでは、名前はあなたのメインで作られていますが、チェックするために渡しますが、実際にはnameCheckから何も返さないので、名前は残ります..返すことはありません。 – BugFinder

答えて

2

オンnameCheck

n = Console.ReadLine(); 

これはローカル変数nの値を変更するだけです。

メソッドをstaticに変更しても、予期した結果が得られません。これが機能するために

、あなたは新しい文字列を返す必要があります。

private string nameCheck(string n) 
{ 
    if (String.IsNullOrEmpty(n)) 
    { 
     Console.WriteLine("Geben Sie einen Namen ein") 
     n = Console.ReadLine(); 
    } 
    return n; 
} 

あなたは、あなたのMain方法に変更したい:文字列にメソッドのnameCheckの

Program a = new Program(); 
name = a.nameCheck(name); 
1

は、自分のメインメソッドでこれを試してみてください:

Program a = new Program(); 
name = a.nameCheck(name); 

あなたnameCheck()メソッドは次のようになります。

private string nameCheck(string n) 
{ 
    if (n == "") 
    { 
     Console.WriteLine("Geben Sie einen Namen ein"); 
     n = Console.ReadLine(); 
    } 
    return n; 
} 
1

変更戻り値の型を。それから、私のようにメインメソッドから呼び出してください。

Console.WriteLine("Hallo, wie heißt du?"); 
    string name = Console.ReadLine(); 

    Program a = new Program(); 
    string n=a.nameCheck(name); 

    Console.WriteLine("Hallo " + n); 


    Console.ReadLine(); 

private string nameCheck(string n) 
{ 
    if (n == "") 
    { 
     // Console.WriteLine("Geben Sie einen Namen ein"); 
     return "Geben Sie einen Namen ein"; 
    } 
    return n; 
} 
0

質問にはたくさんの機会があります。

直接refを使用して渡された文字列を変更するためにあなたの方法を定義します。

private void nameCheck(ref string n) 
{ 
    if (n == "") 
    { 
     Console.WriteLine("Geben Sie einen Namen ein"); 
     n = Console.ReadLine(); 
    } 
} 

はこのようにそれを呼び出します。

nameCheck(ref name); 

セカンド 1が非静的および使用にあなたの方法を変更することになりますメンバー変数:

class program 
{ 
    private string name; 

    Main() 
    { 
     //... 
     Program p = new Program(); 
     p.Name = p.checkName(); 
    } 

    private void nameCheck() 
    { 
     if (this.name == "") 
     { 
      Console.WriteLine("Geben Sie einen Namen ein"); 
      this.name = Console.ReadLine(); 
     } 
    } 
} 

サード 1あなたのメソッドの戻り値を使用して:assideとして

class program 
{ 
    Main() 
    { 
     //... 
     Program p = new Program(); 
     string name = ... 
     name = p.checkName(name); 
    } 

    private string nameCheck(string name) 
    { 
     if (name == "") 
     { 
      Console.WriteLine("Geben Sie einen Namen ein"); 
      name = Console.ReadLine(); 
     } 
     return name; 
    } 
}  

ではなく=="に対するチェックのif (String.IsNullOrEmpty(name))を使用することを検討してください。

-1

nameCheckは何も返しません(戻り値の型はvoid)。

次のことを試してみてください。

private string nameCheck(string n) 
    { 
     if (n == "") 
     { 
      Console.WriteLine("Geben Sie einen Namen ein"); 
      n = Console.ReadLine(); 
     } 
     return n; 
    } 

、その後、あなたが

ベスト戻り値の型にし、ポインタをよく読んで
 name = a.nameCheck(name); 

 a.nameCheck(name); 

を変更する必要がある - 探してみてくださいそれらのための良いチュートリアル。

+0

ありがとう、削除されました。 – GunChleoc

0

ので...あなたが実際にその文字列に、ボイドからチャンスにそれを必要とするあなたのnameCheckボイドから

private string nameChech(string input) 
{ 
    if(string.IsNullOrWhiteSpace(input)) 
     return string.Empty; 
    /* other checking code */ 
    return input // you can do any string that may have been altered/appended/etc 
} 

を文字列を返すようになりましたあなたのProgram.csであなたができます!

static void Main(string[] args) 
    { 
     Console.WriteLine("Hallo, wie heißt du?"); 
     string name = nameCheck(console.ReadLine()); 
     if (name == string.Empty) 
     { 
      console.WriteLine(/* no name provided */); 
      return; 
     } 
     /* other checking code */   
     Program a = new Program(); 
     Console.WriteLine("Hallo " + name); 
     Console.ReadLine(); 
    }  
1

ない本当の答えではなく、いくつかの一般的なヒント:

Programはかなりユビキタス名前です。そしてこれは効果的にあなたのプログラム全体を反映します。

C#はオブジェクト指向ですが、すべてをオブジェクトにして関数を追加するだけでは意味がありません。アクセス修飾子とstaticにそれぞれ目的があります。

クラスProgramにはプライベートメソッドnameCheckがあります。あなたはprivateなぜかstaticしかし、インスタンスメソッドをなぜ自分自身に尋ねましたか?
C#コンパイラはそれを許可しますが、セマンティクスを正しく取得できませんでした。

nameCheckは完全にステートレスな方法なので、staticと定義します。また、Programを実際にに変更すると、あなたの意図はに反映されます。
他のすべての方法(そしてより良いOO 1、IMO)は、Nameのようなクラスと、名前としてstringデータメンバーと、nameCheckというクラスを持つことになります。 Mainメソッドはクラスをインスタンス化し、nameCheckを呼び出して知ることができます。


私はOOPの基本を再検討して、それについて特にカプセルを読むことをお勧めします。

関連する問題