给出以下代码:
class Program
{
static void Main(string[] args)
{
var dog = new Dog();
var cat = new Cat();
dog.Print();
cat.Print();
Console.ReadKey();
}
}
public abstract class Animal
{
private static string _name;
protected Animal(string name)
{
_name = name;
}
private static string _hi;
private string SayHi()
{
return _hi ?? (_hi = $"Hi, i'm a {_name}!");
}
public void Print()
{
Console.WriteLine($"{this.GetType().Name} says: {SayHi()}");
}
}
public class Cat : Animal
{
public Cat() : base("Cat")
{
}
}
public class Dog : Animal
{
public Dog() : base("Dog")
{
}
}
生成以下输出:
狗说:嗨,我是猫!猫说:嗨,我是一只猫!
为什么呢?我希望狗能说'#34;嗨,我是狗!"
有人可以a)向我解释这种行为吗?b)让我知道我应该如何更新我的代码?
真实的例子是我在具体类之间共享昂贵的属性。
答案 0 :(得分:1)
您应该更熟悉static
关键字。 This article可能会有所帮助。
标记为static
的字段或属性属于类本身,但不属于此类的实例。当您创建Dog
的新实例时,字段_name
会使用"Dog"
字符串进行初始化。但是,当您创建Cat
的新实例时,字段_name
会更改"Cat"
字符串的值。
由于_name
属于基类Animal
类,所以后代类的每个实例都将引用相同的值。
如果要使static
属于类的实例而不是对类本身进行分类,则应删除_name
修饰符。