c#中的虚拟/抽象字段

本文关键字:抽象 字段 虚拟 | 更新日期: 2023-09-27 18:09:24

是否可以在c#类中使用虚拟/抽象字段?如果有,是如何做到的?

c#中的虚拟/抽象字段

虚拟/抽象字段?不。字段只是用来保存数据的。没有什么要实现的

你可以定义一个Virtual/Abstract Property

您可以使用虚拟或抽象属性:

public abstract string ModelName { get; set; }

不能,一个字段只能被赋值,不能被覆盖。

然而,你可以使用一个属性,它看起来几乎是一样的

public class MyClass {
  public int MyField; //field
  public virtual int MyProperty { get; set; }  //property
}

都可以这样使用:

var x = new MyClass();
Debug.WriteLine("Field is {0}", x.MyField);
Debug.WriteLine("Property is {0}", x.MyProperty);

除非消费者使用反射,否则它看起来完全一样。

MSDN文档的第一句话回答了您的问题:

virtual关键字用于修改方法、属性、索引器或事件声明,并允许其在派生类中被覆盖。

http://msdn.microsoft.com/en-us/library/9fkccyh4 (v = vs.80) . aspx

No。字段不能是虚拟的,但属性可以。

No。你必须使用一个属性来完成你想要做的事情。

一个老问题,但这是我的两分意见:

虽然可能无法创建虚拟字段,但可以实现OP似乎正在寻找的内容,即派生类的字段值与基类的字段值不同。

在构造函数中直接赋值给它。

(如果您有像int i = 1; int j = i;这样的字段初始化器,那么这还不够)。

字段是类中的存储位置-您不能"覆盖"它们或使其成为虚拟的

另一方面,

属性既可以是虚拟的也可以是抽象的。属性只是get/set方法的语法糖,get/set方法完成检索或设置属性值的工作。

属性可以是虚拟的,也许你可以从中获益。至少在NHibernate中大量使用。

基本上你必须有一个方法来虚拟化,虚拟领域应该如何工作?