使用goto时如何解决这个编译错误"Using unassigned local variable 'hak'"?
How to resolve this compilation error "Using unassigned local variable 'hak'" when using goto?
我正在尝试以下代码。它给了我一个警告“使用未分配的局部变量 'hak'”。我想我在这里遗漏了一些东西。
我希望它在局部变量“right”等于“0”时显示“您输入错误 3 次。联系客户服务代表。祝您愉快。” .但是总是显示“您登录错误,请重试。还剩2。”
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();
}
编译器发现将为变量 hak
定义值的代码行在标签 GIRIS 之前 。不能保证该行一定会被执行,因为GIRIS可以通过代码行goto GIRIS
.
到达
尝试改变这个:
int hak = 3;
GIRIS:
对此:
GIRIS:
int hak = 3;
你得到这个编译错误是因为这一行从未被执行过:
int hak = 3;
这是因为 GOTO,LABELS 的位置和测试条件 if...else
在这条线之上:你永远不会通过这条线。
要解决此编译错误以及由此产生的设计问题,您需要重构所有这些以删除所有 GOTO。
的确,编译的时候,在谈及执行之前,if ( komut == '1' ) ... else ...
,hak
的创建从未达到,去GIRIS
或END
.
因此在您尝试使用 hak
之后,它从未被赋值并且编译器知道并告诉您。
只是为了编译,你需要写:
GIRIS:
int hak = 3;
但是使用 GOTO 是无用且不干净的,非常糟糕 smell,也是错误和奇怪行为的根源。
避免每个世纪多次转到一次,请改用 refactoring。
GOTO still considered harmful?
使用本地方法的最小解决方案示例
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);
}
}
我正在尝试以下代码。它给了我一个警告“使用未分配的局部变量 'hak'”。我想我在这里遗漏了一些东西。
我希望它在局部变量“right”等于“0”时显示“您输入错误 3 次。联系客户服务代表。祝您愉快。” .但是总是显示“您登录错误,请重试。还剩2。”
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();
}
编译器发现将为变量 hak
定义值的代码行在标签 GIRIS 之前 。不能保证该行一定会被执行,因为GIRIS可以通过代码行goto GIRIS
.
尝试改变这个:
int hak = 3;
GIRIS:
对此:
GIRIS:
int hak = 3;
你得到这个编译错误是因为这一行从未被执行过:
int hak = 3;
这是因为 GOTO,LABELS 的位置和测试条件 if...else
在这条线之上:你永远不会通过这条线。
要解决此编译错误以及由此产生的设计问题,您需要重构所有这些以删除所有 GOTO。
的确,编译的时候,在谈及执行之前,if ( komut == '1' ) ... else ...
,hak
的创建从未达到,去GIRIS
或END
.
因此在您尝试使用 hak
之后,它从未被赋值并且编译器知道并告诉您。
只是为了编译,你需要写:
GIRIS:
int hak = 3;
但是使用 GOTO 是无用且不干净的,非常糟糕 smell,也是错误和奇怪行为的根源。
避免每个世纪多次转到一次,请改用 refactoring。
GOTO still considered harmful?
使用本地方法的最小解决方案示例
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);
}
}