假设我创建了一个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;}
}
Run Code Online (Sandbox Code Playgroud)
现在在一些方法上我填充2,3个属性并传递对象和代码中的某个地方我发送50个中的50个.
如果我在这种情况下将这些属性更改为虚拟属性,这会有什么好处吗?
编辑:
我唯一需要知道的是,如果我将这样的对象传递给方法,
SomeObject so1 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
MethodA(so1);
Run Code Online (Sandbox Code Playgroud)
现在在项目的其他地方我这样做,
SomeObject so2 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
....
so1.Property100 = "something";
MethodB(so2);
Run Code Online (Sandbox Code Playgroud)
这种方法有什么不对:)
编辑2:
为什么我说我想让属性虚拟化?因为我正在通过微软虚拟培训学院的ASP.NET MVC培训和6小时内的某个地方视频,所以我们会说几个属性是虚拟的,因为他们每次都不需要它们 - "很可能我理解它错了,并且认为虚拟属性也许是"ON DEMAND"对象"
所以这是我的错,我相信,我会在某些时候再次拍摄视频.
注 - 根据上面的注释,您可能正在寻找一个数组,一个通用(如列表),一个字典,或者您甚至可能想要实现一个属性包.本答案的其余部分解释了何时使用关键字virtual.
声明某些内容的主要目的virtual是为了编写基本实现,然后允许子类提供特定的实现.以下面的例子为例:
public class Car {
public virtual string Make {
get { return "Generic Make"; }
}
}
public class Camaro : Car {
public override string Make {
get { return "Chevy"; }
}
}
Run Code Online (Sandbox Code Playgroud)
现在具体的实现返回"Chevy",但如果开发人员忘记覆盖它,它将只返回"Generic Make".
这里有(至少)两种选择:
使用new关键字隐藏基类实现:
public class Car {
public string Make {
get { return "Generic Make"; }
}
}
public class Camaro : Car {
public new string Make {
get { return "Chevy"; }
}
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是您必须转换为子类类型才能获得特定的实现.换句话说,如果你有一个Car物体,你总会得到"通用制造"作为该车的品牌.Camaro为了获得"雪佛兰"的制作,你必须投出一个!
另一种选择是在基类中使用受保护的属性,然后在子类中设置.这看起来像:
public class Car {
protected string _carMake = "Generic Make";
public string Make {
get { return _carMake; }
}
}
public class Camaro : Car {
public Camaro() : base() {
_carMake = "Chevy";
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用Make基类上的属性将返回适当的值(generic vs chevy).
在线学习类,继承和覆盖行为可能有很多好的资源.希望这至少可以让你开始!