【问题标题】:C# accessing a class'es member from private static voidC# 从私有静态 void 访问类的成员
【发布时间】:2014-03-02 23:43:17
【问题描述】:

我需要同时使用“public int”(不是 100% 确定)和“private static void”(100% 确定!!)

但是,我无法从私有静态 void 中访问类的成员数据。

谁能告诉我如何解决这个问题或解决方法?

非常感谢您的帮助!

namespace MyDLL
{

    public class clsDLL
    {
        ThirdPartyAPI _api = new ThirdPartyAPI();
        double _X = 0;

        //My C# project is a COM DLL that will be called by other applications, so I have chosen "public int" here
        public int open(string uKey)
        {
            int iRet = _api.Open(uKey);
            return iRet;
        }

        //This is a callback that will be called by "_api"
        private static void CallBack_MoveDetected(ref MoveData data, IntPtr userData)
        {
            _X=data.positionX; //this does not work. I can not access "_X" from here.
        }

    }
}

【问题讨论】:

  • 这就是拥有静态方法的全部意义所在,它与任何特定实例无关。
  • 为什么方法需要是静态的?什么是_X,它代表什么?实例成员需要对象的实例,静态成员没有实例的上下文。您将需要根据对象(实例)和概念(静态)来定义您的业务领域。
  • 您可以将实例变量传递给静态方法并为实例添加 get 属性
  • 静态和非静态有什么区别?一直没看懂。
  • @tmighty Google 是你的朋友。

标签: c# class static-methods member


【解决方案1】:

不确定这是否有意义,但您可以将班级更改为

namespace MyDLL
{
    public class clsDLL
    {
        ThirdPartyAPI _api = new ThirdPartyAPI();
        double _X = 0;

        public double X 
        { 
           get{ return _X;} 
           set{ _X = value;}
        }

        public int open(string uKey)
        {
            int iRet = _api.Open(uKey);
            return iRet;
        }

        private static void CallBack_MoveDetected(ref MoveData data, 
                            IntPtr userData, clsDLL instance)
        {
            instance.X=data.positionX; 
        }
    }
}

回到你最初的问题。不,没有类的实例,静态方法无法直接使用实例变量。想想看。静态方法的存在不需要声明任何实例,因此,如果您尝试做的事情以任何方式可行,那么静态方法应该选择哪个实例来读取变量 _X 的值?

【讨论】:

  • 谢谢。然而问题是 CallBack_MoveDetected 不是由我定义的,而是由 ThirdPartyAPI 定义的,因此我无法更改参数以将其传递给类的实例。
  • 我不想将 CallBack_MoveDetected 设为静态,但我不得不这样做。否则我得到了一个委托错误,委托真的超出了我的视野。但我明白它不应该是静态的。
  • 我想我可以从 userData 获取类。但我认为,这比我的丑陋解决方法更丑陋。
  • 不能为委托使用非静态方法似乎有点奇怪。也许您应该展示如何设置对此方法的调用
  • 我不得不把我的项目剥离下来,让它在这里可读,但设置是这样的:MoveDetected += new MoveDetectedDelegate(Callback_MoveDetected); IntPtr p; p = Marshal.GetFunctionPointerForDelegate(MoveDetected); _api.SetMoveCB(p.ToInt32(), IntPtr.Zero);
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2016-01-28
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多