Это может быть плохой практикой, если бы не тот факт, что уже достаточно очевидно, о чем вы говорите в своем коде, основываясь на контексте.
Dog = new Dog();
Какой конструктор типа? Какой объект? Не смущен? Хорошо, как насчет
Dog = Dog.Create()?
Какой объект? Какой метод статической фабрики для типа? Все еще не смущен? Я так не думаю.
Единственный раз, когда я видел, что это потенциальная проблема, это когда дерево пространства имен становится довольно сложным, и компилятор не может понять неоднозначность, и в этом случае вы получаете что-то вроде
Dog = new Some.Namespace.Dog();
В любом случае это должно происходить только с автоматическими свойствами (и, возможно, с перечислениями), поскольку имена локальных переменных всегда находятся в camelCased, полностью избегая неоднозначности.
dog = new Dog();