对象类是否具有虚成员

本文关键字:成员 是否 对象 | 更新日期: 2023-09-27 18:05:30

假设我创建了一个SomeObject类它有100个属性或成员,像这样,

Public Class SomeObject
{
  Public string Property1 {get; set;}
  Public string Property2 {get; set;}
  Public string Property3 {get; set;}
  Public string Property4 {get; set;}
  .... so on
  Public string Property100 {get; set;}
}

现在在一些方法中,我填充了2,3个属性并传递了对象,在代码的某个地方,我发送了50个中的50个。

如果我在这种情况下将这些属性更改为虚拟属性会有什么好处吗?

编辑:

我唯一需要知道的是,如果我把上面的对象像这样传递给一个方法,
SomeObject so1 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
MethodA(so1);

现在我在项目的其他地方做这个,

SomeObject so2 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
....
so1.Property100 = "something";
MethodB(so2);

这个方法有什么不对吗?)

编辑2:

为什么我说我想使属性虚?因为我正在经历ASP。. NET MVC培训在微软虚拟培训学院和某个地方的6个小时的视频家伙说,我们将使一些属性虚拟,因为他们不需要他们每次-"最有可能我理解错了,认为虚拟属性可能是"按需"对象"

我想这是我的错,我以后会再讲一遍

对象类是否具有虚成员

-根据上面的注释,您可能正在寻找一个数组,一个泛型(如列表),一个字典,或者您甚至可能想要实现一个属性包。这个答案的其余部分解释了何时使用关键字virtual


将某些东西声明为virtual的主要目的是让您可以编写基本实现,然后允许子类提供特定的实现。例如:

public class Car {
    public virtual string Make {
        get { return "Generic Make"; }
    }
}
public class Camaro : Car {
    public override string Make {
        get { return "Chevy"; }
    }
}

现在具体的实现返回"Chevy",但如果开发人员忘记覆盖它,它将返回"Generic Make"。

这里(至少)有两种选择:

  1. 使用new关键字隐藏基类实现:

    public class Car {
        public string Make {
            get { return "Generic Make"; }
        }
    }
    public class Camaro : Car {
        public new string Make {
            get { return "Chevy"; }
        }
    }
    

    唯一的问题是,为了获得特定的实现,您必须转换为子类类型。换句话说,如果你有一个Car对象,你将总是得到"通用制造"作为那辆车的制造。你必须扮演一个Camaro,才能让"雪佛兰"回来!

  2. 另一个选择是在基类中使用受保护的属性,然后在子类中进行设置。这看起来像:

    public class Car {
        protected string _carMake = "Generic Make";
        public string Make {
            get { return _carMake; }
        }
    }
    public class Camaro : Car {
        public Camaro() : base() {
            _carMake = "Chevy";
        }
    }
    

    现在在基类上使用Make属性将返回适当的值(generic vs chevy)

网上可能有很多很好的资源可以用来学习类、继承和覆盖行为。希望这至少能让你开始!

如果您预计类的继承者将override成员或使用继承的实现,则将方法或属性声明为virtual


任何有100个属性从Property1枚举到Property100的类都是糟糕的设计。该特性与是否应该使用virtual关键字声明这些属性无关。