我做了一些逻辑,但它得到了错误?
这里是我的代码
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)
答案 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)
基本上,它不起作用:)
if
或else
块中{
和}
之间定义的变量仅在该块中可见。这就是为什么你能够将它定义两次,一次在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);