【问题标题】:access a Form1 public function from static class inside Form1从 Form1 中的静态类访问 Form1 公共函数
【发布时间】:2012-08-27 20:57:23
【问题描述】:

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

     }

}

我无法使用主窗体中的公共“辅助方法”Str2Int() 来为 testStr2Int 赋值 我遇到错误:

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

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

  • 重新编辑

在这两个答案之后...

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

但是! 我已将方法 Str2Int(STR) 从 public 变成 public static

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

感谢 tp 也将其设为静态,

当将 Str2Int() 从 public 更改为 public static 时,我是否缺少其他“隐藏”缺点?

【问题讨论】:

    标签: c# class static-classes


    【解决方案1】:

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

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

    查看this page 以获得对 static 关键字的解释,也请多努力阅读C# coding conventions - 这使人们在您寻求此类帮助时更容易阅读您的代码!

    扩展上面的编辑:

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

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

    【讨论】:

    • 。抱歉,我正在处理其他一些问题,您可以查看我的个人资料,但现在我看到您写的答案,我标记为正确答案,我真的非常感谢您提供的非常有用的信息,尽管我有一种感觉正如你暗示的那样,这就是我试图避免它的原因......但我讨厌实例化非静态(公共)......我不知道在我的语言中什么是正确的英语术语,它是两个词讨厌和for-免费没有理由......只是盯着它是仇恨(:我会尽快适应它,在未来的代码中你会看到它实现
    【解决方案2】:

    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 中而不是在静态类中。

    【讨论】:

    • 我的帖子已经转了,不知道你会不会回来重读
    • @LoneXcoder:如果你将 Form 的方法设为 static,这意味着你无法通过该方法访问任何非静态的 Form 成员。
    • 谢谢,我想我试过了,但无法跟随你我可能有一个错误的语法,你没有在你的代码中显示我会重新检查这个......有一个错误和太多的波浪线..我现在可以在重新编辑时看到问题是否与它自己的表单名称和MyLoadedBtmpToolBox中的声明有关,就在你的例子中,除非 MainForm 是一个保留字,或者我只是跟着你像鹦鹉一样盲目(:
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2013-05-01
    相关资源
    最近更新 更多