【问题标题】:C# can't use variable from IF statementC# 不能使用 IF 语句中的变量
【发布时间】:2021-04-13 09:15:55
【问题描述】:

我正在制作简单的密码生成器,但我无法从 try 中选择 int 并从 if 中选择 string。这是代码。我希望你能帮助我。我不能把它作为文本框,我不能用它做任何事情。

private void button3_Click(object sender, EventArgs e)
{
    try
    {
        int i = Int32.Parse(textBox2.Text);
        return;
    }
    catch
    {

    }
    CreatePassword(i);
}

这是CreatePassword函数的一部分

public string CreatePassword(int length)
{
    if (checkBox2.Checked)
    {
        const string src = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        return src;
    }
    else
    {
        const string src = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        return src;
    }
}

【问题讨论】:

  • 将声明移出尝试。另外:看看Int32.TryParse
  • 这能回答你的问题吗? Variable scope confusion in C#
  • 没有。已经看过这个问题,但对我不起作用。

标签: c# desktop-application


【解决方案1】:

您的代码存在几个问题。首先,您试图在声明的范围之外访问变量i;它在 try 语句之外不可见。其次,您似乎希望从您解析的整数生成密码,但您在创建密码之前明确返回。第三,你没有对创建的密码做任何事情,只是把它扔掉。

尝试以下方法:

    private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            int i = Int32.Parse(textBox2.Text);
            string password = CreatePassword(i);
            // TODO: use the 'password' string for something.
            return;
        }
        catch
        {

        }
    }

您还应该考虑改用int.TryParse,它不会引发异常。

    if (int.TryParse(textbox2.Text, out int i) {
        string password = CreatePassword(i);
        // Do something with 'password' 
    } else {
        // Display an error.
    }

【讨论】:

  • 我想从文本框中获取 int 作为密码长度。已经修复了这个尝试 thx。但我仍然无法从 IF 返回值。我想将名为“src”的值返回到函数中。
【解决方案2】:

从您的示例看来,您需要的只是Int32.TryParse

int.TryParse(textBox2.Text, out int i);
CreatePassword(i);

但是,要回答您最初的问题:您需要在 try 块之外初始化 i 变量,以便能够在它之后使用它。例如:

        int i = 0;
        try
        {
            i = int.Parse("test");
        }
        catch
        {

        }
        Console.WriteLine(i); // 0

【讨论】:

  • 究竟有什么不适合您?如果您对i 中包含0 的想法不满意,因为它可能是有效的解析结果,您可以使用int? i = null;,然后在try-catch 块之后检查if(i != null)
  • 我的 IF 有问题。当我在 if 中设置它时,它称为“变量 src 不存在”。所以我的问题是我怎样才能返回这个变量 src 在这个语句中使用
  • 如果你在谈论你的第二个代码 sn-p, CreatePassword 方法 - 将 src 声明移到 if-else 块之外,然后在其中分配它的值。所以CreatePassword 应该是:public string CreatePassword(int length) { string src = string.Empty; if (checkBox2.Checked) { src = "ifpassword"; } else { src = "elsapassword"; } return src; }
  • 我应该提到我同意 John Källén 和 RvdK 的观点,因为他们对逻辑本身提出了有效的观点。但我只想向您展示如何推进开发,让业务逻辑方面由您自行决定。
【解决方案3】:

你的逻辑有点缺陷。如果 Textbox2 不包含有效整数,则忽略异常并仅创建密码。您希望创建什么样的密码?

我认为你的意思是这样做:

private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            int i = Int32.Parse(textBox2.Text);
            CreatePassword(i);
        }
        catch
        {
            // Show a messagebox or something
        }
    }

【讨论】:

  • Textbox2 有带有一些数字的字符串。所以我想用 Int32.Parse 转换为 int。我只想生成一个简单的字符串。如果您单击复选框,那么您将生成带有数字的密码。如果未选中,则您可以通过没有 num
【解决方案4】:

感谢大家的帮助。我做到了。在这里,您有我的应用程序的来源,谢谢大家。我的应用程序完全可以运行,我相信您理解我的逻辑:D

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Password_generator
{
    public partial class Form1 : Form
    {
        private bool _dragging = false;
        private Point _start_point = new Point(0, 0);
        public Form1()
        {
            InitializeComponent();
        }

        public string CreatePassword(int length)
        {
            string src;
            var sb = new StringBuilder();
            Random RNG = new Random();

            src = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

            if (checkBox2.Checked)
            {
                src += "1234567890";
            }
            if (checkBox3.Checked)
            {
                src += "@#$%^&*()";
            }
            for (var i = 0; i < length; i++)
            {
                var c = src[RNG.Next(0, src.Length)];
                sb.Append(c);
            }
            textBox1.Text = sb.ToString();

            if (checkBox1.Checked)
            {
                try
                {
                    File.AppendAllText("hesla.txt", textBox1.Text + Environment.NewLine);
                }
                catch(Exception o)
                {
                    MessageBox.Show("Něco se nepovedlo! " + Environment.NewLine + "(" + o.Message + ")");
                }
            }

            return textBox1.Text;

        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                int i = Int32.Parse(textBox2.Text);
                CreatePassword(i);
            }
            catch
            {
                MessageBox.Show("Musíš zadat číslo!");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            _dragging = false;
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (_dragging)
            {
                Point p = PointToScreen(e.Location);
                Location = new Point(p.X - this._start_point.X, p.Y - this._start_point.Y);
            }
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            _dragging = true;
            _start_point = new Point(e.X, e.Y);
        }

        private void panel3_Paint(object sender, PaintEventArgs e)
        {

        }

        private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void checkBox2_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                Clipboard.SetText(textBox1.Text);
            }
            catch
            {

            }
            
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多