C#if else逻辑错误

时间:2012-12-28 21:41:52

标签: c# winforms

我做了一些逻辑,但它得到了错误?

这里是我的代码

private static void DrawText(String text, Font font, Color textColor, Color backColor)
{
    Image img = new Bitmap(640, 360);
    Graphics drawing = Graphics.FromImage(img);

    Color color = textColor;
    if (text.Length <= 80) {
        Rectangle displayRectangle =
            new Rectangle(new Point(20, 100), new Size(img.Width - 1, img.Height - 1));
    } else {
        Rectangle displayRectangle =
            new Rectangle(new Point(20, 80), new Size(img.Width - 1, img.Height - 1));
    }
    StringFormat format1 = new StringFormat(StringFormatFlags.NoClip);
    StringFormat format2 = new StringFormat(format1);

     // ERROR ON NEXT LINE
    drawing.DrawString(text, font, Brushes.Red, (RectangleF)displayRectangle, format2);

    drawing.Dispose();
    string fileName = "f.png";
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
    img.Save(path, System.Drawing.Imaging.ImageFormat.Png);

    img.Dispose();
}

错误是

  

错误1当前上下文中不存在名称“displayRectangle”C:\ Documents and Settings \ admin \ My Documents \ Visual Studio 2008&gt; \ Projects \ template \ template \ Form1.cs 119 69模板

在这一行

drawing.DrawString(text, font, Brushes.Red, (RectangleF)displayRectangle, format2);

在php中逻辑是正确的,但是在C#中它的错误是什么?在C#中如何做这个逻辑?

有任何帮助吗? (仍在学习C#:D)

7 个答案:

答案 0 :(得分:12)

Rectangle定义移到if else块上方,以使其不会超出范围。

Rectangle displayRectangle;

if (text.Length <= 80)
{
    displayRectangle = new Rectangle(new Point(20, 100), new Size(img.Width  img.Height - 1));
}
else
{
    displayRectangle = new Rectangle(new Point(20, 80), new Size(img.Width -  img.Height - 1));
}

答案 1 :(得分:5)

基本上,它不起作用:)

ifelse块中{}之间定义的变量仅在该块中可见。这就是为什么你能够将它定义两次,一次在if分支中,一次在else分支中。

因此,解决方案是在分支之前声明变量,并将其设置在if / else分支中。

Rectangle displayRectangle; //declaration

if (text.Length <= 80)
{
  //setting
  displayRectangle = new Rectangle(new Point(20, 100), new Size(img.Width - 1, img.Height - 1));
}
else
{
  //setting
  displayRectangle = new Rectangle(new Point(20, 80), new Size(img.Width - 1, img.Height - 1));
}
....
//usage
drawing.DrawString(text, font, Brushes.Red, (RectangleF)displayRectangle, format2);

此外,C#编译器足够智能,可以检测到每个分支中都设置了变量,因此当它到达它的使用代码时肯定会被设置。但是,如果没有在每个分支中设置,那将是编译错误,例如

if (text.Length <= 80)
{
  displayRectangle = ...;
}
else if (text.Length > 40)
{

  displayRectangle = ...;
}

答案 2 :(得分:4)

您可以在if / else逻辑之外定义displayRectangle变量:

Rectangle displayRectangle;
if (text.Length <= 80)
{
    displayRectangle = new Rectangle(new Point(20, 100), new Size(img.Width - 1, img.Height - 1));
}
else
{
    displayRectangle = new Rectangle(new Point(20, 80), new Size(img.Width - 1, img.Height - 1));
}

现在这个变量将为外部范围所知。

答案 3 :(得分:3)

您不能使用在当前范围之外声明的变量。您已在displayRectangle内声明if-clause,因此它在其外部是“隐身的”。

而是在外面声明它并在里面初始化它:

Rectangle displayRectangle = Rectangle.Empty;
if (text.Length <= 80)
{
     displayRectangle = new Rectangle(new Point(20, 100), new Size(img.Width - 1, img.Height - 1));
}
else
{
    displayRectangle = new Rectangle(new Point(20, 80), new Size(img.Width - 1, img.Height - 1));
}

8.5.1 Local variable declarations

  

在local-variable-declaration中声明的局部变量的范围   是声明发生的块。引用是错误的   到位于文本位置之前的局部变量   局部变量的local-variable-declarator。在范围内   局部变量,声明另一个本地是一个编译时错误   具有相同名称的变量或常量。

答案 4 :(得分:1)

将变量声明移到块外:

    Rectangle displayRectangle;
    if (text.Length <= 80)
    {
        displayRectangle = new Rectangle(new Point(20, 100), new Size(img.Width - 1, img.Height - 1));
    }
    else
    {
        displayRectangle = new Rectangle(new Point(20, 80), new Size(img.Width - 1, img.Height - 1));
    }

问题是代码中displayRectangle的范围。一旦块执行完毕,就完全忘记了displayRectangle,因为它是在块中声明的。

答案 5 :(得分:1)

我认为这是因为你的初始化。

应该如此:

 private static void DrawText(String text, Font font, Color textColor, Color backColor)
 {
    Rectangle displayRectangle; // YOU MUST DECLARE IT HERE OR OUTSIDE THE FUNCTION,
                                // but never inside an "if" statement.
    Image img = new Bitmap(640, 360);
    Graphics drawing = Graphics.FromImage(img);

    Color color = textColor;
    if (text.Length <= 80) {
        displayRectangle =
           new Rectangle(new Point(20, 100), new Size(img.Width - 1, img.Height - 1));
    } else {
        displayRectangle =
           new Rectangle(new Point(20, 80), new Size(img.Width - 1, img.Height - 1));
    }
    StringFormat format1 = new StringFormat(StringFormatFlags.NoClip);
    StringFormat format2 = new StringFormat(format1);

    // ERROR ON NEXT LINE
    drawing.DrawString(text, font, Brushes.Red, (RectangleF)displayRectangle, format2);

    drawing.Dispose();
    string fileName = "f.png";
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
    img.Save(path, System.Drawing.Imaging.ImageFormat.Png);

    img.Dispose();
}

答案 6 :(得分:1)

如果您真的想要简洁,可以使用以下代码行替换整个IF / ELSE块:

var displayRectangle = new Rectangle(20, (text.Length > 80 ? 80 : 100), img.Width - 1, img.Height - 1);