【问题标题】:How do I pass a parameter by ref to a member variable?如何通过 ref 将参数传递给成员变量?
【发布时间】:2020-12-20 05:40:22
【问题描述】:

从很久以前的 C++ 背景开始,对 C# 还是很陌生,所以我似乎在从 C# 中的指针转换到 ref 时遇到了麻烦。

我有一个使用所示构造函数创建的类 (EColour)。

我分配(或至少尝试)将对 cellTemplate 的引用分配给变量 m_template。

在debug中看,在构建的时候,m_template肯定是NOT null的。

但是,当我开始处理 OnMouseClick 事件时,我收到了一个 null 异常错误,因为 m_template 已经神奇地变成了 null。

谁能说明我做错了什么以及如何解决它?

public EColour(ref ICellTemplate cellTemplate)
{
    m_template = (ColourTemplate)cellTemplate;
}

protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
{
    ColorDialog dlg = new ColorDialog();
    dlg.AnyColor = m_template.AnyColour; // This throws an exception because m_template is null
    
    base.OnMouseClick(e);
}

ColourTemplate m_template;

【问题讨论】:

  • 这需要minimal reproducible example 才能看到发生了什么。确定是同一个对象吗?其他地方什么都没有触及变量?为什么还是变量ref
  • 它不能神奇地变为空。也许您正在查看班级的不同实例?也就是说,您不需要 ref 关键字,它不会像您认为的那样做。您应该只在 C# 中将它用于在 C++ 中需要双指针 typename** 的情况。 C# 中的所有类都是引用类型,这意味着它们会自动作为引用传递,您无需为此做任何事情。
  • 重新迭代: 1) 它不能神奇地变为空。你没有向我们展示一些重要的东西。 2) 最好的办法是您可以使用 minimal reproducible example 更新您的帖子
  • 你能显示调用构造函数的方法吗?

标签: c# parameters ref


【解决方案1】:

在 C# 中,我们主要有两种类型:

value type - its all digit types (int, float, double, long ...)
reference type -its types that inherited from object

ICellTemplate 是一个引用类。所以你需要什么 - 只需将它作为常规变量发送到参数中。

public class EColour
{
    private ColourTemplate m_tamplate;

    public EColour(ICellTemplate cellTemplate)
    {
        m_template = (ColourTemplate)cellTemplate;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多