2016-08-01 32 views
0

In der Methode nameCheck überprüfe ich einfach, ob irgendeine Eingabe gegeben ist.Wie bekomme ich eine Variable von einer privaten Methode zu einer statischen Methode?

Zuerst habe ich versucht, die Methode zu static und machte eine public Variable zu ändern, aber dann merkte ich es nicht, weil die Main-Methode static ist arbeiten kann name kann so nicht funktionieren. Ich suchte im Internet und stellte fest, dass ich kein Objekt nameCheck verwenden, also löste ich das.

Nun weiß ich nicht, wie die string in dem Verfahren erhalten nameCheck zum string in meiner Main Methode.

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

Machen Sie Ihre private Methode auch statisch und rufen Sie sie einfach von Ihrer Main-Methode. Keine Notwendigkeit, eine neue Instanz von Program zu erstellen. –

+4

Es ist wirklich nicht klar, was Sie hier zu tun versuchen. Ich denke, du musst deine Logik überdenken, was du machst ist wahrscheinlich nicht schwierig. Vielleicht müssen Sie zuerst nur ein C# -Tutorial durchgehen? – DavidG

+0

In Ihrem Code hier ist der Name in Ihrem Haupt gemacht, Sie übergeben es überprüft werden, aber tatsächlich nichts zurück von nameCheck, so bleibt der Name .. es gibt keine Weitergabe zurück .. – BugFinder

Antwort

2

Auf nameCheck:

n = Console.ReadLine(); 

Dies wird nur den Wert der lokalen Variablen n ändern.

Auch wenn Sie Ihre Methode zu static ändern, erhalten Sie nicht das erwartete Ergebnis.

Damit dies funktioniert, müssen Sie die neue Zeichenfolge zurück:

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

Sie haben Ihre Werte in Ihrer Methode zurückzukehren "nameCheck"

Versuchen Sie dies in Ihrem Haupt Methode:

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

Ihre nameCheck() Methode sollte wie folgt aussehen:

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

ändern Rückgabetyp Methode nameCheck in string:

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

Sie würden dann Main Methode ändern. Und dann rufen Sie es von der Hauptmethode als wie ich tat

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

Sie haben eine Menge Möglichkeiten zu Ihrer Frage.

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

Nennen Sie es wie folgt aus::

nameCheck(ref name); 

Zweite ein Ihre Methode nicht statisch und Verwendung Ändern würde

Definieren Sie Ihre Methode, um die übergebenen String direkt ref mit sich ändern Eine Elementvariable:

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

Dritte ein mit einem Rückgabewert für Ihre Methode:

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

Als asside betrachten if (String.IsNullOrEmpty(name)) zu verwenden, anstatt gegen ==" zu prüfen.

-1

Das Problem ist, dass nameCheck nichts zurückgibt (der Rückgabetyp ist void).

Versuchen Sie Folgendes:

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

und dann müssen Sie

 a.nameCheck(name); 

zu

 name = a.nameCheck(name); 

besten lesen Sie auf Rückgabetypen und auf Zeiger ändern - versuchen, einen zu finden gutes Tutorial für diejenigen.

+0

Danke, entfernt. – GunChleoc

0

Um einen String aus Ihrem nameCheck void zurückgeben Sie tatsächlich von einer Lücke in einen String Chance so ...

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 
} 

so in ihrem Program.cs brauchen würden Sie tun können!

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

Keine wirkliche Antwort, sondern einige allgemeine Tipps:

Program ist ein ziemlich allgegenwärtigen Namen. Und das spiegelt effektiv Ihr gesamtes Programm wider.

C# ist objektorientiert, aber das bedeutet nicht, dass Sie einfach alles zu einem Objekt machen und Funktionen hinzufügen können. Die Zugriffsmodifikatoren und static haben jeweils ihren Zweck.

Ihre Klasse Program hat eine private Methode nameCheck. Haben Sie sich gefragt, warum private oder warum nicht static aber eine Instanzmethode?
Der C# -Compiler erlaubt es, aber Sie haben die Semantik nicht richtig verstanden.

Da nameCheck eine vollständig zustandslose Methode ist, definieren Sie sie lieber static. Ändern Sie auch Program zu etwas, das tatsächlich Ihre Absicht widerspiegelt.
Ein ganz anderer Weg (und die bessere OO, IMO) wäre eine Klasse wie Name mit einem string Datenelement für den Namen und eine Methode nameCheck zu haben. Die Main Methode kann die Klasse instanziieren und nameCheck aufrufen, wie es gefällt.


rate ich würde die Grundlagen der OOP zu überdenken und darüber, vor allem Verkapselung nachlesen.