如何引用在初始化程序中用c#初始化的对象?
假设我有类似如下的对象初始化:如何引用在初始化程序中用c#初始化的对象?
var coolObject = new CoolObject()
{
GetObjectState =() => coolObject.InternalState;
}
哪里GetObjectState是返回某种对象的状态上CoolObject的功能。在这种情况下,我希望该函数简单地返回coolObject的内部状态对象。代码对象显然不会编译,因为在声明它之前不能引用局部变量。
有没有办法解决这个问题?是否有类似于初始化程序的“this”关键字?
CoolObject coolObject = null;
coolObject = new CoolObject()
{
GetObjectState =() => coolObject.InternalState;
}
虽然如果coolObject的值在调用之前发生更改,此代码是不安全的。
这会编译,当然,但不会我的匿名方法指向一个空引用的对象?它会指向coolObject的第一个声明,它指向堆上的空值。然后当第二行运行时,它会在堆上创建一个新对象,但是我的方法仍然会指向第一个,不是? –
@JonathanBeerhalter这很好; lambda关闭了*变量*,而不是变量的值。第二行运行后,悬挂的变量将引用非空的'CoolObject'。不过,这是一个危险且不必要的计划。只是重构,所以你不必这样做。 – dlev
匿名方法将指向coolObject,一旦它被执行,它会找出coolObject的值。我不记得实际发生了什么,但我相信类是生成的,其中一个引用了coolObject,而不是坐在堆上的,而是当前坐在堆栈上的coolObject的值。 –
你就不能删除{},即什么是错的:
var coolObject = new CoolObject();
coolObject.GetObjectState =() => coolObject.InternalState;
在阐述我的意见:有没有理由使用这种方法。你几乎可以肯定更好只是定义GetObjectState
作为一个实际的方法,而不是Func<TypeOfInternalState>
:
public TypeOfInternalState GetObjectState() { return this.InternalState }
现在有没有需要编译器吊起一个局部变量,也没有怪异的建筑语法,其中你提到的一个引用当前正在构造的对象的变量。
没错,但是你不能改变GetObjectState()在运行时如何执行。我不能调用GetObjectState = {这里有一些代码} –
我想,但这仍然是一个非常脆弱的方法。在派生类中创建“虚拟”方法然后重写,几乎完全相同,除了以安全和明显的方式。我明白当你确实希望类的消费者指定行为时(尽管如此,它通常作为构造函数的参数被设置一次)的思想,但是考虑到你的方法旨在检索对象的状态(a非常私人的操作,只能由对象本身来完成)我认为应该避免你的方法。 – dlev
如何:
public class CoolObject
{
public CoolObject()
{
GetObjectState =() => this.InternalState;
}
public Func<InternalState> GetObjectState;
}
您可以覆盖你的心脏的内容和默认状态适用于大多数情况下。
你必须使用构造函数吗?有什么原因让你不能在CoolObject上拥有一个静态属性并将其用于你的任务? – wsanville
@wsanville可能因为不同的实例需要返回不同的对象状态。 –
这是不是构造函数的一部分的原因吗?这就是我们有建设者采取论据和做事的原因之一。 –