我的课程定义如下:
public class Foo
{
private int _LengthVar;
private string _StringVar;
public string StringVar
{
get { return _StringVar; }
set { _StringVar = value;
_LengthVar = value.Length;
}
}
public int LengthVar
{
get { return _LengthVar; }
}
}
我创建了Foo
class =>
object obj = new Foo();
当我尝试使用StringVar
向属性obj.StringVar="some val";
分配一些值时,它不会允许;其中((Foo)obj).StringVar = "this is another value";
是有效的作业。
但是当我删除赋值并运行程序并检查断点时,obj会显示Foo
类的所有属性。
这是我的怀疑; 对象是否具有动态行为?
答案 0 :(得分:1)
但是当我删除赋值并运行程序并检查断点时,obj会显示
Foo
类的所有属性。
调试器/ IDE正在检查实际对象 - 而不是变量。在这种情况下,变量的类型为object
;但是它指向的对象:是Foo
,始终是Foo
,并且始终是Foo
。您可以通过以下方式查看:
var typeName = obj.GetType().Name; // Foo, not object
(同样,它看实际对象,而不是类型)
但具体来说:
对象是否具有动态行为?
不,他们没有。除非您通过DynamicObject
使用dynamic
之类的内容,但这只是完全不同的乐趣。
答案 1 :(得分:-1)
答案是否定的,不应该
object obj = new Foo()
表示将Foo实例转换为“对象”类型引用。
你现在正在反对一个“对象”。在你明确地把它扔掉之前不要跟狗。
e.g。
Animal someAnimal = new Dog();
Animal anotherAnimal = new Bird();
考虑为什么动物实例没有名为Bark()/ Fly()的行为在您使用Animal实例时完全不合逻辑。