在c#中存储ref

时间:2011-12-07 15:16:04

标签: c# reference

我有一种感觉,我将会收到很多关于“你N000B”的评论。

我有这堂课:

public partial class FindAndReplace : Form
{
    public FindAndReplace()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

    }
}

我希望能够做这样的事情来存储在其他函数中使用的引用:

public partial class FindAndReplace : Form
{
    SomeRefType m_TabRef; // Dont know what type to use
    public FindAndReplace(ref TabControl launguageTabs)
    {
        InitializeComponent();
        m_TabRef = languageTab;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // use m_TabRef here that will change the original I passed in
    }
}

一种解决方法是使用TabControl的副本并返回我想要标记的位置。我只是想知道我是否可以使用原版。

如果人们谷歌也可以认为这篇文章可能会有用。

如果这是C ++就很容易:/

4 个答案:

答案 0 :(得分:5)

由于TabControl已经是一个引用类型,你可以简单地使用它:

TabControl m_TabRef;

public FindAndReplace(TabControl launguageTabs)
{
    m_TabRef = languageTab;

    // from now m_TabRef references the object instance
    // passed as launguageTabs reference
}

答案 1 :(得分:3)

在C#中,类引用类型。所以languageTabs就像一个指向对象的指针,它不是对象本身。因此,你可以写下这个:

public partial class FindAndReplace : Form
{
    TabControl m_TabRef; // use TabControl 
    public FindAndReplace(TabControl launguageTabs)
    {
        InitializeComponent();
        m_TabRef = languageTab;
    }
}

这与C#中的struct不同,它们是值类型。值类型默认按值传递,这就是ref关键字的来源。除非你真的知道它的作用,否则你不应该使用ref关键字。大部分时间你都不需要它。

答案 2 :(得分:2)

你不能拥有班级的ref成员; ref仅作为函数参数修饰符有效。

此外,您很可能将传递引用概念(通过ref公开)与引用类型概念(通过类,它们是引用类型公开)混淆)。

很可能,您只需忘记ref存在,从代码中删除所有此类引用,它将按您的预期方式工作。如果没有,请更具体地说明您要完成的任务。

答案 3 :(得分:0)

此引用仅作为参考传递帮助,它不是引用类型。

http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

你说你想要存储参考资料"

这里有一个双重帖子: Storing a reference in c#