【问题标题】:void* alternative in C#C# 中的 void* 替代方案
【发布时间】:2011-08-24 22:56:31
【问题描述】:

我正在创建一个调用回调函数的类,我希望它在某些情况下传递一些数据,但这些数据可能会有所不同。在 C++ 中我会使用 void* 但在 C# 中它是不安全的,这意味着它可能会被 GCed。有没有办法在 C# 中传递未知类型的数据?

【问题讨论】:

  • 强大的力量意味着巨大的责任。我的意思是即使 C++ 允许使用这些技巧 - 不要忘记设计。
  • 真正的问题是你为什么要创建一个必须“猜测”它正在处理的数据类型的函数?
  • 在我看来,具有未定义参数类型的回调(委托)是弱应用程序设计的结果。您能提供更多信息吗?
  • 弱设计是可能的,因为我对 C# 还比较陌生,现在我正在为几乎每次特定的鼠标点击创建一个新类。所有元素都是动态创建并添加到 StackPanels 或 Grids 中的,但它们具有功能,例如隐藏它们。为了做到这一点,我必须在某处保存对它的引用,所以我只为那种鼠标点击创建了一个类。它一直在继续......现在我正在尝试制作一些通用的点击处理程序,它将这些数据传递给回调函数,这将大大减少代码量。

标签: c# function arguments void-pointers


【解决方案1】:

你有两个选择:

Generics(它允许您在调用方法时指定类型......并且对象将在方法中正确键入。)

// Definition:
public void MyMethod<T>(T myParameter)
{
    /* My Code */
}

// Call:
MyMethod<int>(999);

// Call:
MyMethod<bool>(false);

System.Object(这意味着您必须在方法中确定对象的实际类型并进行适当的转换)

// Definition:
public void MyMethod(Object myParameter)
{
    /* My Code */
}

// Call:
MyMethod(999);

// Call:
MyMethod(false);

【讨论】:

  • 准备好输入你想要的任何东西。
  • @Tejs:我什至会说“cast”而不是“convert”
  • 每当你让System.Object 参与其中,这表明你很有可能做错了。
  • 如果您正在编写所有自己的代码,供您自己的代码使用(大多数人都在这样做),那么可以。
  • @antisanity - 很高兴你同意!
【解决方案2】:

【讨论】:

  • 嗯...泛型...忘了他们。是的,这对我来说可能是一个解决方案;)
  • 嘿,看起来@antisanity 将我的答案纳入了他的。
【解决方案3】:

最简单的解决方案是使用object 类型,因为所有其他对象都继承自该对象。这样做你允许自己传入任何对象类型。

http://msdn.microsoft.com/en-us/library/system.object.aspx

【讨论】:

    【解决方案4】:

    你可以将它传递给一个对象。与 C++ 不同,您可以在 C# 中进行类型安全转换,而在 C++ 中则不能。

    【讨论】:

      【解决方案5】:

      我认为你应该使用 Object。

      【讨论】:

        【解决方案6】:

        如果您在 .net 4 中工作,您也可以使用 dynamic 类型。

        【讨论】:

          猜你喜欢
          • 2010-09-15
          • 2018-02-06
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多