C#'s type system draws one line that explains a large fraction of its behavior: is a type a value type or a reference type? Everything in this reference — string immutability, boxing, why mutating one variable sometimes affects another, why some equality checks succeed and others don't — falls out of that single distinction, plus a handful of related mechanisms (static, nullability, ref/out) that interact with it constantly in real code. Work through it in order, or jump straight to the section you need from the sidebar.