Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
110 views
in Technique[技术] by (71.8m points)

c# - How to resolve this compilation error "Using unassigned local variable 'hak'" when using goto?

I'm trying below code. It gives me a warning "Use of unassigned local variable 'hak' ". I guess I'm missing something here.

I want it to display "3 defa yanl?? giri? yapt?n?z. Mü?teri hizmetleri temsilcisiyle g?rü?ünüz. ?yi günler dileriz." when local variable "hak" equals to "0". But it always display "Hatal? Giri? Yapt?n?z. Lütfen tekrar deneyiniz. 2 hakk?n?z kalm??t?r."

                   Console.Write("Se?mek istedi?iniz 'Kullan?c? Ad?'n? belirtiniz: ");
        string kullanici_adi = Console.ReadLine();
        FARKLISIFRE:
        Console.Write("Lütfen ?ifrenizi giriniz: ");
        string sifre = Console.ReadLine();
        Console.Write("Girmi? oldu?unuz ?ifreyi tekrar giriniz: ");
        string sifre2 = Console.ReadLine();

        int karsilastirma = String.Compare(sifre, sifre2);
        if (karsilastirma==0)
        {
            Console.WriteLine("Tebrikler! Kayd?n?z ba?ar?l? bir ?ekilde olu?turulmu?tur.");
        }
        else
        {
            Console.WriteLine("Girmi? oldu?unuz ?ifreler birbirinden farkl?d?r. Lütfen tekrar deneyiniz.");
            goto FARKLISIFRE;
        }

        Console.Write("Giri? yapmak i?in lütfen '1' se?ene?ini giriniz: ");
        char komut = Convert.ToChar(Console.ReadLine());
        Console.Clear();
        if (komut=='1')
        {
            goto GIRIS;
        }

        else
        {
            Console.Write("??k?? yapt?n?z. ?yi günler dileriz.");
            goto END;
        }
        
        int hak = 3;

        GIRIS:
        Console.Write("Lütfen Kullan?c? Ad?n?z? Giriniz: ");
        string kullanici_adi_giris = Console.ReadLine();
        Console.Write("Lütfen belirlemi? oldu?unuz ?ifrenizi giriniz: ");
        string sifre_giris = Console.ReadLine();

        int karsilastirma_k_adi = String.Compare(kullanici_adi, kullanici_adi_giris);
        int karsilastirma_sifre = String.Compare(sifre, sifre_giris);
        
        if (karsilastirma_k_adi == 0 && karsilastirma_sifre == 0)
        {
            Console.Write("Ba?ar?yla Giri? Yapt?n?z. Ho?geldiniz.");
        }
        else if (hak == 0)
        {
            Console.Write("3 defa yanl?? giri? yapt?n?z. Mü?teri hizmetleri temsilcisiyle g?rü?ünüz. ?yi günler dileriz.");
        }
        else
        {
            hak--;
            Console.WriteLine("Hatal? Giri? Yapt?n?z. Lütfen tekrar deneyiniz. {0} hakk?n?z kalm??t?r.", hak);
            goto GIRIS;
        }
        
        END:
        Console.ReadKey();
    }
question from:https://stackoverflow.com/questions/65906189/how-to-resolve-this-compilation-error-using-unassigned-local-variable-hak-wh

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You got this compile error because this line is never executed:

int hak = 3;

It is because of the GOTOs, the position of the LABELS and the test condition if...else above this line: you never pass this line.

To solve this compile error as well as the design problem which is thus generated, you need to refactor all that to remove all the GOTOs.

Indeed, when compiling, before talking about executing, the if ( komut == '1' ) ... else ..., the hak creation in never reached, going to GIRIS or END.

Thus after when you try to use hak, it never was assigned and the compiler know that and tell you that.

Just to get to compile, you need to write:

GIRIS:
int hak = 3;

But using GOTOs is trashy and not clean, a very bad smell, as well as being source of mistakes and weird behaviors.

enter image description here

Avoid goto more than one once per century, and use refactoring instead, please.

GOTO still considered harmful?

Spaghetti code

Example of a minimal solution using a local method

if ( komut == '1' )
{
  int hak = 3;
  GIRIS(ref hak);
}
else
{
  Console.Write("??k?? yapt?n?z. ?yi günler dileriz.");
}

Console.ReadKey();

void GIRIS(ref int hak)
{
  Console.Write("Lütfen Kullan?c? Ad?n?z? Giriniz: ");
  string kullanici_adi_giris = Console.ReadLine();
  Console.Write("Lütfen belirlemi? oldu?unuz ?ifrenizi giriniz: ");
  string sifre_giris = Console.ReadLine();

  int karsilastirma_k_adi = String.Compare(kullanici_adi, kullanici_adi_giris);
  int karsilastirma_sifre = String.Compare(sifre, sifre_giris);

  if ( karsilastirma_k_adi == 0 && karsilastirma_sifre == 0 )
  {
    Console.Write("Ba?ar?yla Giri? Yapt?n?z. Ho?geldiniz.");
  }
  else if ( hak == 0 )
  {
    Console.Write("3 defa yanl?? giri? yapt?n?z. Mü?teri hizmetleri temsilcisiyle g?rü?ünüz. ?yi günler dileriz.");
  }
  else
  {
    hak--;
    Console.WriteLine("Hatal? Giri? Yapt?n?z. Lütfen tekrar deneyiniz. {0} hakk?n?z kalm??t?r.", hak);
    GIRIS(ref hak);
  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...