假设我创建了一个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小时的某个地方视频,所以我们会说很少有虚拟属性,因为他们每次都不需要它们 - "很可能我理解错了并且认为虚拟财产可能是某种东西"在需求"对象"
所以我相信我的错,我会在某个时候再次拍摄视频。
答案 0 :(得分:5)
注意 - 根据上述评论,您可能正在寻找an array,a generic (such as a list),a dictionary,或者您甚至可能希望实施{{3} }}。本回答的其余部分解释了何时使用关键字virtual
。
将某些内容声明为virtual
的主要目的是让您可以编写基本实现,然后允许子类提供特定的实现。以下面的例子为例:
public class Car {
public virtual string Make {
get { return "Generic Make"; }
}
}
public class Camaro : Car {
public override string Make {
get { return "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"; }
}
}
唯一的问题是你必须转换为子类类型才能获得具体的实现。换句话说,如果你有一个Car
对象,你将永远得到" Generic Make"作为那辆车的品牌。你必须作为Camaro
进行演员才能获得&#34;雪佛兰&#34;回<!/ p>
另一个选项是在基类中使用受保护的属性,然后在子类中设置。这看起来像:
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)。
在线学习类,继承和覆盖行为可能有很多好的资源。希望这至少可以让你开始!
答案 1 :(得分:3)
如果您预期某个类的继承者override
成员或使用继承的实现,则将方法或属性声明为virtual
。
任何枚举Property1
到Property100
的100个属性的类设计都很糟糕。此特性与是否应使用virtual
关键字声明这些属性无关。