C# Method Sorunu

MrGranddy

Kilopat
Katılım
2 Haziran 2015
Mesajlar
11
Merhaba arkadaşlar ben programlamaya tarih olarak eskiden olsa da ayırdığım süre olarak yeni başlamış biriyim. Oyun yapımcısı olmaya karar verdim ve C# öğrenmeye başladım, haliyle çok fazla bilmediğim şey çıkıyor şu anda da bir problem ile karşı karşıyayım. Şöyle ki:

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

namespace BasicGame
{
    class Program
    {
         static public void Asking(string valueType)
        {
            string answer;
            string value;

            Console.Write("Please enter your " + valueType + ": ");
            value = Console.ReadLine();

            Start:
            Console.WriteLine("Your " + valueType + " is " + value + ". Do you wish to change your " + valueType + "?");
            answer = Console.ReadLine().ToLower();
            if (answer == "yes")
            {
                Console.Write("Please write your new " + valueType + ": ");
                value = Console.ReadLine();
                Console.WriteLine("Your " + valueType + " has changed to " + value + ".");
                goto Start;
            }
            else if (answer == "no")
            {
            }
            else
            {
                Console.WriteLine("Please answer by typing yes or no.");
                goto Start;
            }

        }

        static void Main(string[] args)
        {

            Asking("name");
            Asking("age");
            Console.ReadKey();

        }
    }
}

Gördüğünüz kodda amacım her seferinde soru sorma kodlarını defalarca yazacağıma bir method ile işimi kolaylaştırmaktı ilk defa bu tarz bir şeyi tamamen kendim düşünüp yaptığım için çok sevinmiştim ama sonra bazı problemler olduğunu fark ettim:
1. Bir kere Asking methodundaki value değerini Main methodumda kullanamıyorum çünkü o orada tanımlı.
2. Zaten o değeri alabilmiş olsam da en son age'i tanımladığım için sadece yaş verisini kullanabilicem.
Buradaki 2. probleme çok güzel bir çözüm getirmiş olsam da en son şöyle bir hal aldı kod:

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

namespace BasicGame
{
    class Program
    {
        int x = 0;
        string[] values = new string[2];

         static public void Asking(string valueType)
        {
            string answer;
            Program a = new Program();

            Console.Write("Please enter your " + valueType + ": ");
            a.values[a.x] = Console.ReadLine();

            Start:
            Console.WriteLine("Your " + valueType + " is " + a.values[a.x] + ". Do you wish to change your " + valueType + "?");
            answer = Console.ReadLine().ToLower();
            if (answer == "yes")
            {
                Console.Write("Please write your new " + valueType + ": ");
                a.values[a.x] = Console.ReadLine();
                Console.WriteLine("Your " + valueType + " has changed to " + a.values[a.x] + ".");
                goto Start;
            }
            else if (answer == "no")
            {
            }
            else
            {
                Console.WriteLine("Please answer by typing yes or no.");
                goto Start;
            }

        }

        static void Main(string[] args)
        {
            Program a = new Program();
            Asking("name");
                a.x++;
            Asking("age");

            Console.WriteLine(a.values[0] + a.values[1]);
            Console.ReadKey();

        }
    }
}

Şimdi problem şu ki ikisinde de kullanabilmek için değeri methodların dışında tanımlasam bile bir methodun içinde yaptığım değişiklik yine de methodun dışındakileri etkilemiyor. Ben bu Asking methodunu çalıştırdıktan sonra isim ve yaş değerlerini ayrı ayrı elde edip kullanabilmek için ne yapabilirim?
Mesela şunu da denedim Asking methodunu return type yaptım Console.WriteLine(Asking("name")) şeklinde kullanmayı denedim bu sefer de her bu şekilde name değerini çağırmaya kalkıştığımda baştan bütün methodu çalıştırıyor yani bir anlamı kalmıyor. İlginiz için teşekkürler.
 
Programı çok karıştırmışsınız. Program sınıfının nesnesini yeniden çalıştırmamanız lazım. Çünkü o programımızı temsil ediyor. Başka sınıf yazıp o sınıfın nesnesini istediğiniz kadar çağırın sorun yok. Ayrıca goto terimini de kullanmayın. Çünkü program hangi aşamada nereye gidecek kaos oluşabilir. Goto kullanılan yerler var örneğin switch içinde. Goto yerine kendini tekrarlayan metot yazabilirsiniz. İngilizcesi recursive function.
Does anyone still use [goto] in C# and if so why?

Programı düzeltip birazdan yollarım bekleyin.

Bu kodu inceleyin birazdan daha düzgün halini yollayacağım.
Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Questionnaire a = new Questionnaire();
            a.Asking("name");
            a.X++;
            a.Asking("age");

            Console.WriteLine(a.Values[0] + a.Values[1]);
            Console.ReadKey();
        }
    }

    public class Questionnaire
    {
        //Özellikler

        //Bu özelliğin yerel değişkeni sadece sınıf içinden çağırılır.
        private int _x = 0;
        //Bu da özellik yani property dışardan erişimi yapılır.
        //Erişimi kısıtlayabilirsiniz (readonly) ve ya dışarıdan gelen veri üzerinde işlem yapabilirsiniz
        public int X
        {
            get { return _x; }
            set { _x = value; }
        }


        private string[] _values = new string[2];

        public string[] Values
        {
            get { return _values; }
            set { _values = value; }
        }
     
        public Questionnaire()
        {

        }

        public void Asking(string valueType)
        {
            Console.Write("Please enter your " + valueType + ": ");
            _values[X] = Console.ReadLine();
            RecursiveFunction(valueType);
        }
        void RecursiveFunction(string valueType)
        {
            string answer;
            Console.WriteLine("Your " + valueType + " is " + _values[X] + ". Do you wish to change your " + valueType + "?");
            answer = Console.ReadLine().ToLower();
            if (answer == "yes")
            {
                Console.Write("Please write your new " + valueType + ": ");
                _values[X] = Console.ReadLine();
                Console.WriteLine("Your " + valueType + " has changed to " + _values[X] + ".");
                RecursiveFunction(valueType);
            }
            else if (answer == "no")
            {
            }
            else
            {
                Console.WriteLine("Please answer by typing yes or no.");
                RecursiveFunction(valueType);
            }
        }
    }
}

Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Questionnaire a = new Questionnaire();
            Console.WriteLine(a.Cevap);
            Console.ReadKey();
        }
    }
    public class Questionnaire
    {
        private Dictionary<string, string> _sözlük = new Dictionary<string, string>();
        public Dictionary<string,string> Sözlük
        {
            get { return _sözlük; }
        }
        private string _cevap;
        public string Cevap
        {
            get { return _cevap; }
        }
        public Questionnaire()
        {
            Asking("name");
            Asking("age");
            _cevap = _sözlük["name"] + _sözlük["age"];
        }
        void Asking(string valueType)
        {
            Console.Write("Please enter your " + valueType + ": ");
            _sözlük[valueType] = Console.ReadLine();
            RecursiveFunction(valueType);
        }
        void RecursiveFunction(string valueType)
        {
            Console.WriteLine("Your " + valueType + " is " + _sözlük[valueType] + ". Do you wish to change your " + valueType + "?");
            string answer = Console.ReadLine().ToLower();
            if (answer == "yes")
            {
                Console.Write("Please write your new " + valueType + ": ");
                _sözlük[valueType] = Console.ReadLine();
                Console.WriteLine("Your " + valueType + " has changed to " + _sözlük[valueType] + ".");
                RecursiveFunction(valueType);
            }
            else if (answer == "no")
            {
                return;
            }
            else
            {
                Console.WriteLine("Please answer by typing yes or no.");
                RecursiveFunction(valueType);
            }
        }
    }
}
 
Uyarı! Bu konu 9 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Geri
Yukarı