C# 关于C语言中构造函数的问题#

C# 关于C语言中构造函数的问题#,c#,constructor,C#,Constructor,你好 关于名为Square的类中的此部分代码: public Square( int i_RowIndex, eColumn i_ColIndex) { m_RowIndex = i_RowIndex; m_ColIndex = i_ColIndex; **new Square(i_RowIndex, i_ColIndex, eCoinType.NoCoin);** } public Square(int i_RowIndex, eColumn i_ColIndex,

你好
关于名为Square的类中的此部分代码:

public Square( int i_RowIndex, eColumn i_ColIndex) 
{
    m_RowIndex = i_RowIndex;
    m_ColIndex = i_ColIndex;
    **new Square(i_RowIndex, i_ColIndex, eCoinType.NoCoin);**
}

public Square(int i_RowIndex, eColumn i_ColIndex, eCoinType i_CoinType) 
{
    m_RowIndex = i_RowIndex;
    m_ColIndex = i_ColIndex;
    m_Coin = i_CoinType;
}
在另一个C'tor中调用重载的C'tor并使用粗体显示的“new”语句是不是不好? 我认为这是错误的,每次我们调用new时,我们都会分配一个新实例,从C'tor分配两个重复实例是不对的,这意味着从第一个位置分配一个实例

我错了吗


谢谢

您不应该从构造函数中调用重载构造函数,这样会创建一个新实例

应该更像:

public Square( int i_RowIndex, eColumn i_ColIndex)
    : this(i_RowIndex, i_ColIndex, eCoinType.NoCoin)
{
}

public Square(int i_RowIndex, eColumn i_ColIndex, eCoinType i_CoinType) 
{
    m_RowIndex = i_RowIndex;
    m_ColIndex = i_ColIndex;
    m_Coin = i_CoinType;
}    

我想你想要的是更像这样的东西:

public Square( int i_RowIndex, eColumn i_ColIndex) 
    : this(i_RowIndex, i_ColIndex, eCoinType.NoCoin) 
{}

public Square(int i_RowIndex, eColumn i_ColIndex, eCoinType i_CoinType) 
{
    m_RowIndex = i_RowIndex;
    m_ColIndex = i_ColIndex;
    m_Coin = i_CoinType;
} 

调用
new
将创建另一个实例,该实例将被垃圾收集,因为您没有存储对它的引用。此外,原始实例中的m_Coin不会被设置(或者更准确地说,将被设置为
默认值(eCointType)

这是不对的。事实上,这句话:

new Square(i_RowIndex, i_ColIndex, eCoinType.NoCoin);

在你的构造函数上绝对没有任何有用的东西。

它确实创建了一个新实例,最终被GCed。@BoltClock:True。但是我不想把OP和一些非继承相关的信息混淆起来。:-)记住:
new
关键字总是创建一个新对象(并且新对象与以前存在的任何其他对象不同)。@pst:FYI实际上,表达式中的new关键字并不总是分配新存储。如果编译器能够确定修改作为“new”目标的变量所产生的副作用如果无法观察值类型,则编译器会优化临时存储的创建,并将新存储的副本复制到旧变量中。(当然,成员声明中的new关键字与任何类型的内存分配无关。)@pst:当然,新对象很可能与已经存在的对象相同。例如,允许CLR的实现在它认为合适的情况下缓存和重用不可变字符串的实例。此外,假设您对一个int进行装箱,然后gc运行,该框消失,然后您再次装箱相同的int。您可以最后,同一个对象在同一个内存槽中具有相同的内容。我希望您不要依赖您的错误主张,即每个对象实例化在整个时间内都是可以区分的;这是在玩火。@Eric,有用的信息一如既往。虽然我知道CLR允许重复使用不可变字符串的实例(这就是实习的工作原理,对吗?),我从来没有意识到CLR允许重用盒装值类型。@Eric Lippert感谢您提供的详细信息。我并没有试图暗示所提到的内容的一半(所以我似乎不再在回复评论时提醒我了)。我认为是“自我回答”包含这些细节的帖子会非常有趣。(我可能只是错过了适用的现有SO问题)。
public Square( int i_RowIndex, eColumn i_ColIndex) : this(i_RowIndex, i_ColIndex, eCoinType.NoCoin)
{

}

public Square(int i_RowIndex, eColumn i_ColIndex, eCoinType i_CoinType) 
{
            m_RowIndex = i_RowIndex;
            m_ColIndex = i_ColIndex;
            m_Coin = i_CoinType;
}