Je l'attendais celle-là
Les paramètres sont toujours par valeur, une référence est une valeur (ou une adresse si tu préfères, c'est à dire un entier passé par copie).
Ensuite oui un objet est toujours une référence, c'est logique si tu codes vraiment en POO (chacun peut affecter l'état d'un objet, car il est considéré comme une entité indépendante, du coup tu ne devrais pas te reposer sur son état interne; ça rejoint la prog par "message" en C dont je parlais plus tôt). Mais là on parle de vrais objets, pas d'enregistrements (struct en C) ou d'objets encapsulant un élément mathématique, qui ne sont pas des objets au sens POO.
D'ailleurs en C# le type struct j'évite vraiment sur le principe, les seuls cas où ça se justifie c'est pour les vecteurs, bigint et autres, mais c'est particulier. Ensuite l'utilisation abusive de ref en C# dénote presque toujours un code de merde, du moins d'un point de vue POO (je ne trouve pas de contre-exemple).
Ensuite utiliser une référence const juste pour améliorer les perfs c'est pas mal sur le principe et on peut justifier que c'est une bonne habitude, mais c'est déjà un truc "avancé" qui est contraignant et pas très bon pour débuter, et je le répète mais ça correspond à une programmation procédurale, pas objet, puisque tu utilises ton objet comme un enregistrement.