Самый просто ответ. При статической типизации тип переменных определяется на этапе компиляции, а в динамической в процессе выполнения. Так же можно отметить, что при статической типизации код становится чуть понятнее за счет явных типов, но при динамической можно упростить код, ведь одной переменной может хватить для одного класса
Начнем с места хранения. Значимые типы храниться в стеке. Ссылочные типы хранятся в куче, а ссылки на них в стеке. При попытке скопировать значимый тип - мы копируем значение. При попытке скопировать ссылочный тип - мы копируем только ссылку
Ref - ключевое слово, которое позволяет передавать не значение, а ссылку на переменную где хранится это значение. Меняя значения внутри метода мы меняем значение переменной которую передовали
Out - ключевое слово, которое обязует проинициализировать параметр метода внутри. Бывает полезно когда нужно вернуть несколько типов из одного метода




