我想创建一个存储对另一个对象的引用的对象。我有这样的代码:
org.eclipse.rcptt.tesla.swt
如果我点击button2 - 我可以看到" 1"在我的标签。但是,如果我点击button2然后按钮1 - 我仍然会看到" 1"。我应该如何改变我的代码,以便我能够看到" 7"在那种情况下?
答案 0 :(得分:3)
当您创建store
对象时,您正在评估test
变量的值,并存储该值而不是测试变量。如果您希望稍后有一种方法可以将变量评估为其值,则可以使用lambda来关闭变量,因为C#中的闭包关闭变量,而不是值
public partial class Form1 : Form
{
int test = 1;
Store<string> store;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
store = new Store<string>(() => test.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
test = 7;
}
private void button2_Click(object sender, EventArgs e)
{
label1.Text = store.GetValue();
}
}
public class Store<T>
{
private Func<T> function;
public Store(Func<T> function)
{
this.function = function;
}
public T GetValue()
{
return function();
}
}
请注意,我对符合标准C#约定的项目名称进行了一些更改,而不是让Store
公开显示生成器函数的字段,我提供的功能可以让您获得价值,我也使它成为通用的,而不是使用object
,因为这既避免了装箱,又防止了转换从商店返回的对象的需要。
答案 1 :(得分:-1)
只需稍加改动,就可以了。 Form1的属性和构造函数:
public Form1()
{
st = new store(test);
}
private int testPrivate { get; set; }
public int test
{
get { return testPrivate; }
set
{
testPrivate = value;
st.o = value;
}
}
public store st { get; set; }
商店类:
public class store
{
public object o { get; set; }
public store(object obj)
{
o = obj;
}
}