Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在构造函数中初始化虚拟属性是否错误?_C#_Oop_Inheritance_Constructor - Fatal编程技术网

C# 在构造函数中初始化虚拟属性是否错误?

C# 在构造函数中初始化虚拟属性是否错误?,c#,oop,inheritance,constructor,C#,Oop,Inheritance,Constructor,在构造函数中初始化虚拟属性是否错误?这感觉不对,因为如果您重写派生类中的属性,该属性将首先使用基类构造函数中的值初始化,然后派生类构造函数将再次赋值。有没有其他方法可以这样做?我说的是这样的事情 internal class B1 { public B1() { Ti = "Hello"; } public virtual string Ti { get; set; } } internal class B2 : B1 { public

在构造函数中初始化虚拟属性是否错误?这感觉不对,因为如果您重写派生类中的属性,该属性将首先使用基类构造函数中的值初始化,然后派生类构造函数将再次赋值。有没有其他方法可以这样做?我说的是这样的事情

internal class B1
{
    public B1()
    {
        Ti = "Hello";
    }

    public virtual string Ti { get; set; }
}

internal class B2 : B1
{
    public B2()
    {
        Ti = "HelloKitty";
    }

    public override string Ti { get; set; } //<--"Hello" will be assigned first then "HelloKitty" will be assigned
}

internal class Program
{
    private static void Main(string[] args)
    {
        var b2 = new B2();
        Console.WriteLine(b2.Ti);
        Process.GetCurrentProcess().WaitForExit();
    }
}
基类中的变量_ti由“Hello”初始化。


如果我使用的不是字符串类型,而是显式需要公开的类型呢

另一方面,这是合理的(注意B2是密封的)


是的,这是错误的:简短回答:是的。这种方法的问题太多了…@code4life-long答案?有两件事一下子就让人想起了:1)查看每个msdn的字段和构造函数初始化顺序,你就会意识到你所创造的悖论。2) 始终保持ctor尽可能简单(例如,仅初始化私有字段,无svc调用等)@code4life您有其他选择吗?如果您密封属性本身也可以(在这种情况下,您不需要密封整个类)。我的观点是使用私有数据成员,避免使用属性。但是你也是对的……但是基类仍然包含分配给“Hello”的m_ti。如果我们不是在讨论字符串,一种需要明确处理的类型,该怎么办?@AbdullahSaleem,那么这将是一个坏主意。听着,我不知道你想做什么,但听起来像是需要合成而不是继承的东西。@AbdullahSaleem看看编辑。。。
internal class Bb1
{
    private string _ti;

    public Bb1()
    {
        _ti = "Hello";
    }

    public virtual string Ti
    {
        get { return _ti; }
        set { _ti = value; }
    }
}

internal sealed class Bb2 : Bb1
{
    public Bb2()
    {
        Ti = "HelloKitty";
    }

    public override string Ti { get; set; }
}
internal class B1
{
    private string m_ti;
    public virtual string Ti { get{return m_ti;} set{m_ti = value;} }
    public B1()
    {
        m_ti = "Hello";
    }


}

internal sealed class B2 : B1
{
    public B2()
    {
        Ti = "HelloKitty";
    }

    public override string Ti { get; set; } //<--"Hello" will be assigned first then "HelloKitty" will be assigned
}
internal class B1
{
    private string m_ti;
    public virtual string Ti { get { return m_ti; } set { m_ti = value; } }
    public B1()
    {
        m_ti = "Hello";
    }

    protected B1(String word)
    {
        m_ti = word;
    }
}

internal sealed class B2 : B1
{
    public B2():base("kitty")
    {

    }
}