撰写这篇文章时,我正在检查所有与相关主题有关的问题 并且couldent找到了这个Newbs C#问题的简单答案
我想...如果可以的话,尽可能多地提供一个很好的解释(请!)
我制作了一个公共静态类
public static class MyLoadedBtmpToolBox
{
public static string FnameToLoad;
public static bool PutLoadedByteArrInPicbox;
public static string[] LoadedRefrnce;
public static int SourceX_Loaded, SourceY_Loaded, RectWidth_Loaded, RectHeight_Loaded;
---> public static int tst = Str2Int(LoadedRef[0]);
public static byte[] LoadedByteArr;
}
这个calss通常默认情况下是在我正在使用的主要形式
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.IO;
using System.Security.Cryptography;
using WindowsInput;
namespace MyScrCupTry1
{
public partial class MyForm1 : Form
{
public static class MyLoadedBtmpToolBox
{
public static int testStr2Int = Str2Int("100");
}
public int Str2Int(string STR)
{
int strInt = Convert.ToInt32(null);
if (isntEmpty(STR))
{
strInt = Convert.ToInt32(STR);
}
else
{
MessageBox.Show("theString " + STR + " is Null");
}
return strInt;
}
}
我无法通过使用主表单中的公共“帮助方法”testStr2Int
来确定Str2Int()
值
我遇到了错误:
错误1 非静态字段,方法或属性需要对象引用 'MyScrCupTry1.MyForm1.Str2Int(string)'G:\ RobDevI5- Raid-0 \ Documents \ Visual Studio 2010 \ Projects \ WindowsFormsApplication2 \ WindowsFormsApplication2 \ MyForm1.cs 95 45 MyScrCuptry1
从静态类访问Main Form Public elemets的正确方法是什么 如果可能/(非法)...
在这两个答案之后......
我试图实施 第一个答案的代码没有预期的结果我猜我不知道正确的代码结构与覆盖OnLoad(..)的东西......
但是!
我已将方法Str2Int(STR)
从公开转变为公共静态
所以现在表单中的元素仍然可以Str2Int()
访问(我很惊讶)
从静态类I我也可以访问它....
并且非常感谢tp使其成为静态,
当我将Str2Int()从公共变为公共静态时,我是否遗漏了其他的“隐藏”缺点?答案 0 :(得分:1)
static
代码的意思是属于自己,而不是任何其他对象。为此,当您将某些内容设置为静态时,依赖于它的所有也必须是静态的!
这是您的错误消息试图告诉您的内容。您将某些内容声明为静态,但在计算该静态时,您使用的是非静态内容。 Str2Int
未标记为静态,因此这是一个直接问题,LoadedRef
也可能不是静态的。我确定你真的打算在那里使用LoadedRefrnce
,在这种情况下你很好,但是因为你没有正确拼写我无法确定!
查看this page以获取有关static关键字的说明,还请仔细阅读C# coding conventions - 这可让人们在您寻求帮助时更轻松地阅读您的代码像这样!
扩展上述编辑:
使代码保持静态的“缺点”是它几乎立即使它成为不可测试的一部分。单元测试背后的想法是将所有代码分解为完全可替换的部件,这样它们可以单独测试并单独移出(如果需要)。通过将一堆代码静态化,您实际上将其焊接到它可能属于的任何其他代码。在您自己的示例中,通过使Str2Int()
公共静态,使用Str2Int()
的所有内容现在都是不可测试的!
一般来说,静态代码应该尽可能地避免使用。有些地方你不能,如果你刚刚开始学习,最重要的是让事情变得有效。但是,请准备好回顾这段代码,冷静地看看,如果你对自己的技能更有经验和自信,那么几年后你就会写出如此糟糕的东西。
答案 1 :(得分:0)
将Form
对象添加到静态类,如下所示:
public static class MyLoadedBtmpToolBox
{
public static Form MainForm {get;set;}
public static int testStr2Int = MainForm.Str2Int("100");
}
和Form
:
public partial class MyForm1 : Form
{
private override OnLoad(..){
base.OnLoad(...);
MyLoadedBtmpToolBox.MainForm =this;
}
}
这种设计本身就很脆弱,因为你必须保证MyForm
属性在用于调用..testStr2Int = MainForm.Str2Int("100")..
之前已经初始化 。
因此,考虑到testStr2Int
是公开的,可以在Form
中进行初始化,而不是在静态类中。