我想将一个变量的引用传递给一个类,使用它然后稍后将其解析出来。
这样的事情:
// 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完成后访问类中的任何变量是不可能的。
答案 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)