虚拟属性

Mac*_*ast 41 c#

我只使用和学习了基类的虚方法,而不知道所使用的虚拟属性

class A
{
   public virtual ICollection<B> prop{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这是什么意思吗?

Zen*_*xer 50

public virtual ICollection<B> Prop { get; set; }
Run Code Online (Sandbox Code Playgroud)

几乎直接翻译为:

private ICollection<B> m_Prop;

public virtual ICollection<B> get_Prop()
{
    return m_Prop;
}

public virtual void set_Prop(ICollection<B> value)
{
    m_Prop = value;
}
Run Code Online (Sandbox Code Playgroud)

因此,virtual关键字允许您覆盖子类中的属性,就像上面的get/set方法一样:

public override ICollection<B> Prop
{
    get { return null; }
    set { }
}
Run Code Online (Sandbox Code Playgroud)


Hus*_*vic 6

在实体框架中(我相信您的示例引用),您的POCO类被创建并包装到代理类中.代理类是您声明的类的后代,因此您的类A成为基类.此代理类将填充数据并返回给您.这是跟踪变化所必需的.看看这篇文章http://technet.microsoft.com/en-us/query/dd456848

我在尝试理解这个问题时遇到了类似的问题,经过一些调试会话后,看到了代理类并阅读了跟踪更改,并确定了为什么它被声明的方式.


Beh*_*ati 6

在面向对象的编程中,虚拟属性是一种属性,可以在继承的类中覆盖其行为。这个概念是面向对象编程(OOP)的多态性部分的重要组成部分。

看下面的例子:

public class BaseClass
{

    public int Id { get; set; }
    public virtual string Name { get; set; }

}

public class DerivedClass : BaseClass
{
    public override string Name
    {
        get
        {
            return base.Name;
        }

        set
        {
            base.Name = "test";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在演示级别:

        DerivedClass instance = new DerivedClass() { Id = 2, Name = "behnoud" };

        Console.WriteLine(instance.Name);

        Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

输出将是“ test”,因为派生类(子类)中的“ Name”属性已被覆盖。