Cópia superficial ou cópia profunda?

Eu sou um pouco novo para esses dois métodos de copiar um objeto para o outro. Estou confuso e incapaz de identificar a grande diferença entre cópia profunda e cópia superficial. Eu tinha passado por muita teoria a respeito disso, mas preciso de explicação com exemplos apropriados. Eu tenho um programa no qual eu copio um objeto para outro. . ->

   class A
    {
        public int a = 0;
        public void display()
        {
            Console.WriteLine("The value of a is " + a);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A ob1 = new A();
            ob1.a = 10;
            ob1.display();
            A ob2 = new A();
            ob2 = ob1;
            ob2.display();
            Console.Read();
        }
    }

Esta é uma cópia superficial ou uma cópia profunda? Alguém pode por favor fornecer a resposta com razão. Se for uma cópia profunda, forneça o código para cópia superficial para este programa, fazendo o mesmo trabalho de cópia de objeto, e vice-versa.

Se o acima é uma cópia superficial, então mesmo isso deve ser uma cópia superficial ->

            A ob1 = new A();
            ob1.a = 10;
            ob1.display();
            A ob2 = ob1;
            ob2.a = 444;
            ob1.display();

questionAnswers(6)

yourAnswerToTheQuestion