-2

在写这篇文章时,我正在检查与相关主题相关的所有问题,但无法找到这个 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;

        }

这个类通常默认情况下,在我使用的主要形式中

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公共“帮助方法”来评估 a 值,但我遇到了错误:Str2Int()

错误 1​​非静态字段、方法或属性'MyScrCupTry1.MyForm1.Str2Int(string)' G:\RobDevI5-Raid-0\Documents\Visual Studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\MyForm1 需要对象引用.cs 95 45 MyScrCuptry1

如果可能/(非非法),从静态类访问主窗体公共元素的正确方法是什么...

  • 重新编辑

在这两个答案之后...

我试图从第一个答案中实现代码而没有预期的结果我想我不知道正确的代码结构与覆盖 OnLoad(..) 的东西......

但 ! 我已将方法Str2Int(STR)从公共变为公共静态

所以现在表单本身的元素仍然可以访问(我很惊讶)Str2Int() 静态类,我也可以访问它......

这一切都感谢tp也将其变为静态,

当将 Str2Int() 从 public 更改为 public static 时,我是否遗漏了其他东西是否存在“隐藏”缺点?

4

2 回答 2

1

代码的意义static在于它属于它自己,而不是任何其他对象。要做到这一点,当您将某些内容设置为静态时,依赖于它的所有内容也必须是静态的!

这就是您的错误消息试图告诉您的内容。您将某些东西声明为静态的,但在计算该静态时,您使用的是非静态的东西。 Str2Int没有标记为静态,所以这是一个直接的问题,也有可能LoadedRef不是静态的。我半信半疑你真的打算在LoadedRefrnce那里使用,在这种情况下你很好,但由于你拼写不正确,我不能确定!

查看此页面以获取有关 static 关键字的说明,还请努力阅读C# 编码约定- 这使人们在您寻求此类帮助时更容易阅读您的代码!

扩展上面的编辑:

使代码静态化的“缺点”是它几乎立即使它成为不可测试的一部分。单元测试背后的想法是将所有代码分解成完全可替换的部分,因此它们可以单独测试并单独移出(如果需要)。通过使一堆代码静态化,您实际上是将其焊接到它可能属于的任何其他代码上。在您自己的示例中,通过将Str2Int()public 设为静态,Str2Int()现在使用的所有内容都无法测试!

一般来说,静态代码是你应该尽量避免的恶习。有些地方是你做不到的,如果你才刚刚开始学习,那么最大的重点就是让一些东西发挥作用。但是请准备好回顾这段代码,然后对自己如何在几年内写出如此糟糕的东西感到冷漠,当您对自己的技能更有经验和信心时。

于 2012-08-27T21:03:17.657 回答
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其中而不是在静态类中进行。

于 2012-08-27T21:02:16.140 回答