为什么父的这个静态实例在新的子实例之间共享?

时间:2017-01-30 06:40:02

标签: c# singleton

给出以下代码:

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)让我知道我应该如何更新我的代码?

真实的例子是我在具体类之间共享昂贵的属性。

1 个答案:

答案 0 :(得分:1)

您应该更熟悉static关键字。 This article可能会有所帮助。

标记为static的字段或属性属于类本身,但不属于此类的实例。当您创建Dog的新实例时,字段_name会使用"Dog"字符串进行初始化。但是,当您创建Cat的新实例时,字段_name会更改"Cat"字符串的值。

由于_name属于基类Animal类,所以后代类的每个实例都将引用相同的值。

如果要使static属于类的实例而不是对类本身进行分类,则应删除_name修饰符。