假设我有一个对象:
public class A
{
private int m_a;
private int m_b;
A(int a, int b)
{
m_a = a;
m_b = b;
}
}
这可以完成工作,但我有一个朦胧的记忆被告知它不必要地将整数复制到参数a和b中,然后复制到m_a和m_b中。有没有办法定义类,使参数直接传递给它们的成员对应物?
请注意,我不想讨论C# Object Constructor - shorthand property syntax,因为此处有责任使用该课程。
当然我可能完全错了,也许编译器会删除这些琐事,因此我应该乐意接受任何一种教育。
答案 0 :(得分:6)
这有效但我有一个朦胧的记忆被告知它不必要地将整数复制到参数a和b中,然后复制到m_a和m_b中。
是的,这些值会被复制到参数 a
和b
中,然后再复制到对象本身的状态。
从根本上说,这只是成员调用工作方式的一部分,而且是不可避免的。 C#的未来版本很可能有一种方法可以在源代码中表达更简单,但是存在的“开销”仍然存在 - 并且在绝大多数程序中都是微不足道的。 (事实上它可能会被内联的JIT编译器优化掉......但你几乎肯定不会担心它。)
答案 1 :(得分:1)
我认为您正在考虑C ++成员初始化列表。
答案 2 :(得分:1)
我唯一能想到的就是使用ref
,它会像C ++中的指针一样工作,但这不是你想要使用的东西我想是因为它还有一些其他含义... < / p>
此外,它们不会阻止在第二步中复制int
(设置m_a
)
答案 3 :(得分:1)
如果构造函数中必须分配许多此类字段,那么您可以做的最好的事情就是使用结构来传递参数并存储值。
最后,您必须提供参数值,方法是将它们存储在结构中,或者通过明确地将它们作为构造函数参数传递。但如果你不必一直一个接一个地使用这些值,它将为你节省很多时间。
答案 4 :(得分:1)
构造函数在C#中设计的方式由于.Net的内存处理,我无法理解它是如何构建的。
public void Foo()
{
var a = new A(1,2);
//The 1 and 2 values can safely be removed from memory here.
}
public class A
{
int _a;
int _b;
public A(int a, int b)
{
_a = a;
_b = b;
}
}
当构造函数的参数从内存中删除时,你不会不必要地复制整数。想想存储字段所需的生命周期。 在这种情况下,只需要将1和2存储到构造函数中。但是_a和_b将在对象a的生命周期中存在。这意味着您需要有一些方法可以将构造函数中的参数提升到类或属性中的任何一个字段中,以便在a的生命周期中保留它们。
我认为这可能会为你清除它 http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx