2017-10-02 1 views
-3

VBでは、プライベート変数を直接設定してパブリックメソッドを使用してアクセスするだけで、これは機能しないようです。または、私の問題は、パラメータと引数をどのように扱うかにあります。C#パブリックメソッドからプライベート変数を返すためのパラメータ

誰かがこの問題を解決できると非常に感謝します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Program 
{ 
class Program 
{ 

    private string name; 

    static void Main(string[] args) 
    { 
     SetName(); 
     Console.WriteLine("Name: " & ReturnName()); 
    } 
    private static void SetName() 
    { 
     Console.WriteLine("What is your name?"); 
     string name = Console.ReadLine(); 
    } 
    public static string ReturnName(string name) 
    { 
     return name; 
    } 
} 
} 

エラー:

Screenshot of Problem

+2

をこれらの変数は、その名前(しゃれ意図)を除いて、完全に無関係です。 – Fildor

+0

最初の 'name'('プライベート文字列名; ')は、プログラムクラスのフィールドです。それにアクセスするには、そのクラスの*インスタンス*が必要です。 'SetName()'の 'string name'は、関数が復帰したときに範囲外に出る* local *変数です。それは最初のものとはまったく関係がありません。 'ReturnName'は' name'という名前のパラメータが何であっても返すでしょう... – Fildor

+2

スクリーンショットとしてエラーを投稿するのではなく、テキストとして投稿してください。 Visual Studioからコピーできます。 – waka

答えて

0

private static string name; 

static void Main(string[] args) 
{ 
    SetName(); 
    Console.WriteLine("Name: " + ReturnName()); 
} 

private static void SetName() 
{ 
    Console.WriteLine("What is your name?"); 
    name = Console.ReadLine(); 
} 

public static string ReturnName() 
{ 
    return name; 
} 

少し良くはSetNameメソッドから値を返すと方法の範囲内であることを再利用し、それはちょうど私の意見であることであろうクラスレベルの変数 'name'を宣言した場合、クラススコープで一度初期化することができ、それをパラメータとして 'ReturnName'関数に渡すことができます。

「ReturnName」関数はまったく必要ありません。私は、 'SetName'を 'GetName'に変更して、ユーザーが入力した名前を返します。

static void Main(string[] args) 
    { 
     string name = GetName(); 
     Console.WriteLine("Name: " + name); 
    } 


    private static string GetName() 
    { 
     Console.WriteLine("What is your name?"); 
     string name = Console.ReadLine(); 
     return name; 
    } 
+0

C#にはいつグローバル変数がありますか?つまり、「グローバル」の定義は何ですか? – Fildor

+1

@Fildor私はクラスレベルの変数に編集しました –

+0

このコードはうまくいきますが、今は変数名にどこからでもアクセスできません。私は関数からアクセス可能な変数だけを必要とします。 –

3

あなたは明確な変数を使用しています。これらの変数が共有するのは、その名前だけです。このコードは動作します:あなたが持っているとして

static void Main(string[] args) 
{ 
    string name = AskName(); 
    Console.WriteLine($"Name: {name}."); 
} 

private static string AskName() 
{ 
    Console.WriteLine("What is your name?"); 
    return Console.ReadLine(); 
} 
+0

私は一度の選択肢を得るためにこのメソッドを使用していましたが、後で名前にアクセスしたいので、変数に格納します。 –

+0

最初のコードブロックがそれを処理します。@MaxGoddard –

0

次のような主な機能で直接印刷することができます。 SetName()では、nameという名前のローカル変数(SetName()でのみアクセス可能)を宣言します。ただし、これはクラスの先頭で宣言したインスタンス変数nameには決して接続されていません。

また、C#の文字列連結は+で行われ、&では行われません。

+1

グローバルではありません。 – Fildor

+1

@Fildor:そうです、インスタンス変数です。グローバル変数ではありません。 – waka

1

あなたが望む概念は、C#のプロパティで呼び出されます。

public string Name { get; set; } 

それは自動的にあなたのクラスとあなたがそれらを記述する必要はありませんので、それを包むgetset方法でフィールドを宣言します。しかし、あなたが望むことができます:

あなたのメソッド内でローカル変数を作成しているので、コードが機能しません。 staticの一貫性を保つためにそれを修正し、変数を削除するには:

private static string name; 

private static void SetName() 
{ 
    Console.WriteLine("What is your name?"); 
    name = Console.ReadLine(); 
} 
public static string ReturnName() 
{ 
    return name; 
} 
+1

変数に何が問題なのですか?すべてが財産でなければならないわけではありません。 –

+0

ローカル変数を代入して何もしないか、メソッド内のパラメータを返すのは何ですか?この質問の最初の段落では、カプセル化の '練習'を使用してメソッドの設定メソッドを取得する方法について説明します。 @PatrickHofman – Rafal

関連する問題