b در واقع یا در هر چیز دیگری int نیست. وقتی b رو به تنهایی بکار می برید فقط ارجاع میده، b به تنهایی مقدار چیزی رو بر میگردونه که بهش ارجاع میده، b خودش int نیست، مقداری که بهش ارجاع میده int است، نه خودش. برای همین b به تنهایی یک int رو برمیگردونه، نه به این خاطر که b در واقع int باشه.
وقتی ref b رو بکار می برید مقدار b رو برمیگردونه، یعنی ref b مقدار ارجاع رو برمیگردونه که میتونید بگید یک اشاره گر ئه.
بهتر و بدتری وجود نداره، هیچ ویژگی ای فقط مزایا یا فقط معایب که نداره. اگه weakly typing بهتر از strong typing باشه پس می توانید تکلیف دنیای برنامه نویسی رو روشن کنید و زبان های برنامه نویسی رو از بهترین تا بدترین مرتب کنید، همچین قاعده ای نیست.
در ضمن این خیلی بهتر و خواناتری که ازش حرف می زنید رو بررسی بکنیم؟
فرض کنیم که int a ای داریم و ref int x ای که به اون a ارجاع داده. یعنی x یک نام مستعار برای a محسوب میشه.
یعنی اگر بنویسید ;x = 5 چه اتفاقی می افته؟ مقدار a به 5 تغییر می کنه، x هم همچنان به a ارجاع داده.
حالا اگر یک int b ای داشته باشیم و ref int y به اون b ارجاع داده باشه و بنویسید ;x = y چه اتفاقی قراره بیافته؟
اصولا و طبق تعریف زبان #C یک حالت بیشتر نداره، اگر x رو به عنوان نام مستعار برای a به رسمیت بشناسید و y رو به عنوان نام مستعار برای b، اونوقت باید مقدار b در a قرار بگیره و x و y هم همچنان به همون a و b که ارجاع می دادند بمانند، یعنی ارجاع های x و y تغییری نمی کنه.
C#:
int a = 1;
int b = 2;
ref int x = ref a;
ref int y = ref b;
x = y;
MessageBox.Show($"a={a} b={b} x={x} y={y}");
اما اگر از خودتون قاعده جدید اختراع کرده باشید، توصیف دیگری دارید که باید ارجاع x تغییر کنه و x به b ارجاع بده، a رو با اون مقدار قبلی اش ول کنه و به b ارجاع بده. یعنی یا قاعده جدیدتون ;x = ref y رو به صورت x = y خلاصه می کنید :
C#:
int a = 1;
int b = 2;
ref int x = ref a;
ref int y = ref b;
x = ref y;
MessageBox.Show($"a={a} b={b} x={x} y={y}");
با این فرض شما پس حالت قبلی با چه کدی باید نوشته میشد؟ اگر قرار باشه x = y با x = ref y به یک شکل نوشته بشه، کامپایلر و برنامه نویس با دیدن ;x = y میتونه تشخیص بده که x میخواد مقدار خودش رو تغییر بده یا مقدار متغیری که بهش ارجاع میده؟ این کجاش بهتر و خواناتر ئه؟