如何将引用传入和传出类

时间:2010-07-06 20:28:12

标签: c# class reference

我想将一个变量的引用传递给一个类,使用它然后稍后将其解析出来。

这样的事情:

// Create the comment Screen
string newCommentText = "";
commentsScreen = new CommentEntry(this, ref newCommentText);

commentScreen.ShowDialog();

...

_dataLayer.SaveOffComment(newCommentText);

然后在评论课中:

public partial class CommentEntry : Form
{
    public CommentEntry(Control pControl, ref string commentResult)
    {
        InitializeComponent();
        control = pControl;

        // ***** Need a way for this to store the reference not the value. *****
        _commentResult = commentResult;  
    }


    private string _commentResult;

    private void CommentEntry_Closing(object sender, CancelEventArgs e)
    {
        _commentResult = tbCommentText.Text.Trim();
    }
}

是否有newCommentText可以在结束方法中的_commentResult中设置值?

注意:很明显,在我的类中设置一个变量并在ShowDialog之后访问它很容易。这个例子只是我真实问题的一个近似值,并且在ShowDialog完成后访问类中的任何变量是不可能的。

5 个答案:

答案 0 :(得分:3)

这将永远不会与String一起使用,因为它们是不可变的,变量将更改为指向新实例。

您有两个基本选项。第一种是简单地为结果提供一个getter,以便以后需要时可以访问它。另一个选项是让所有者传入一个委托方法,该方法可以通过传入结果值来调用。然后,当CommentEntry关闭时,所有者将收到该值。

答案 1 :(得分:2)

你通常不能直接在C#中存储'引用',但你可以这样做:

public interface ICommented
{
    string Comment { get; set; }
}

public class MyClass : ICommented
{
    public string Comment { get; set; }
}

public partial class CommentEntry : Form
{
    public CommentEntry(Control pControl, ICommented commented)
    {
        InitializeComponent();
        control = pControl;

        // ***** Need a way for this to store the reference not the value. *****
        _commented = commented;
    }


    private ICommented _commented;

    private void CommentEntry_Closing(object sender, CancelEventArgs e)
    {
        _commented.Comment = tbCommentText.Text.Trim();
    }
}

所以现在你的表单可以编辑任何已经知道如何评论的类的评论。

答案 2 :(得分:2)

正如丹·布莱恩特指出的那样,你不能直接这样做。一种选择是将引用包装到类中,但这需要编写大量的样板代码。一个更简单的选择是使用委托和lambda函数(在C#3.0中)或匿名委托(C#2.0):

string newCommentText = ""; 
// Using lambda that sets the value of (captured) variable
commentsScreen = new CommentEntry(this, newValue => {
  newCommentText = newValue });  
commentScreen.ShowDialog(); 
_dataLayer.SaveOffComment(newCommentText); 

CommentEntry表单的修改版本如下所示:

public partial class CommentEntry : Form { 
  public CommentEntry(Control pControl, Action<string> reportResult) { 
    InitializeComponent(); 
    control = pControl; 
    // Store the delegate in a local field (no problem here)
    _reportResult = reportResult;    
  } 

  private Action<string> _reportResult; 

  private void CommentEntry_Closing(object sender, CancelEventArgs e) { 
    // Invoke the delegate to notify the caller about the value
    _reportResult(tbCommentText.Text.Trim()); 
  } 
} 

答案 3 :(得分:0)

制作CommentEntry类的newComment属性。

答案 4 :(得分:0)