如何引用在初始化程序中用c#初始化的对象?

问题描述:

假设我有类似如下的对象初始化:如何引用在初始化程序中用c#初始化的对象?

var coolObject = new CoolObject() 
{ 
    GetObjectState =() => coolObject.InternalState; 
} 

哪里GetObjectState是返回某种对象的状态上CoolObject的功能。在这种情况下,我希望该函数简单地返回coolObject的内部状态对象。代码对象显然不会编译,因为在声明它之前不能引用局部变量。

有没有办法解决这个问题?是否有类似于初始化程序的“this”关键字?

+0

你必须使用构造函数吗?有什么原因让你不能在CoolObject上拥有一个静态属性并将其用于你的任务? – wsanville

+0

@wsanville可能因为不同的实例需要返回不同的对象状态。 –

+1

这是不是构造函数的一部分的原因吗?这就是我们有建设者采取论据和做事的原因之一。 –

CoolObject coolObject = null; 
coolObject = new CoolObject() 
{ 
    GetObjectState =() => coolObject.InternalState; 
} 

虽然如果coolObject的值在调用之前发生更改,此代码是不安全的。

+0

这会编译,当然,但不会我的匿名方法指向一个空引用的对象?它会指向coolObject的第一个声明,它指向堆上的空值。然后当第二行运行时,它会在堆上创建一个新对象,但是我的方法仍然会指向第一个,不是? –

+0

@JonathanBeerhalter这很好; lambda关闭了*变量*,而不是变量的值。第二行运行后,悬挂的变量将引用非空的'CoolObject'。不过,这是一个危险且不必要的计划。只是重构,所以你不必这样做。 – dlev

+0

匿名方法将指向coolObject,一旦它被执行,它会找出coolObject的值。我不记得实际发生了什么,但我相信类是生成的,其中一个引用了coolObject,而不是坐在堆上的,而是当前坐在堆栈上的coolObject的值。 –

你就不能删除{},即什么是错的:

var coolObject = new CoolObject(); 
coolObject.GetObjectState =() => coolObject.InternalState; 

在阐述我的意见:有没有理由使用这种方法。你几乎可以肯定更好只是定义GetObjectState作为一个实际的方法,而不是Func<TypeOfInternalState>

public TypeOfInternalState GetObjectState() { return this.InternalState } 

现在有没有需要编译器吊起一个局部变量,也没有怪异的建筑语法,其中你提到的一个引用当前正在构造的对象的变量。

+0

没错,但是你不能改变GetObjectState()在运行时如何执行。我不能调用GetObjectState = {这里有一些代码} –

+0

我想,但这仍然是一个非常脆弱的方法。在派生类中创建“虚拟”方法然后重写,几乎完全相同,除了以安全和明显的方式。我明白当你确实希望类的消费者指定行为时(尽管如此,它通常作为构造函数的参数被设置一次)的思想,但是考虑到你的方法旨在检索对象的状态(a非常私人的操作,只能由对象本身来完成)我认为应该避免你的方法。 – dlev

如何:

public class CoolObject 
{ 
    public CoolObject() 
    { 
     GetObjectState =() => this.InternalState; 
    } 

    public Func<InternalState> GetObjectState; 
} 

您可以覆盖你的心脏的内容和默认状态适用于大多数情况下。