Ответ 1
StackTrace
имеет смысл для меня, по крайней мере. Идея состоит в том, что объект Exception
(как объект) может быть передан, возвращен из методов и т.д. StackTrace
важен только в том случае, если исключение выбрано и поймано. В некотором смысле, StackTrace
действительно является скорее свойством бросания исключения, а не самого объекта Exception
.
Что касается изменчивости других свойств, я предполагаю, что это просто потому, что проще построить экземпляр, присваивая свойствам, а не принуждая их всех в конструктор. Помните, что в то время, когда было разработано Exception
, у С# не было необязательных параметров.
Можно подумать о перепроектировании, где Exception
и производные классы неизменяемы, но для этого потребуется исключение factory или класс строителя. Это просто сделало бы более сложным из Exception
.