[50分]咋这么多怪事啊该如何处理

[50分]咋这么多怪事啊?
一,
string是引用类型,那么比较两个实例应当是地址才是啊
string   s= "hello ";
string   t= "hello ";
s,t不应当相等啊
二,
Console.WriteLine((object)1   ==   (object)1);//结果为false
Console.WriteLine((object) "ok "   ==   (object) "ok ");//结果为true
为什么?装箱值代表什么?
三,
string   a   =   "hello ",b=string.Copy(a),c   =   "hello "   ;
Console.WriteLine((object)a   ==   (object)b);//false
Console.WriteLine((object)a   ==   (object)c);//true
为什么?
四,
string   s,t;
s= "ok ";
t=s;
s= "yes ";//改变s并不会同时改变t
这好像不符合引用类型的惯例吧?(跟值类型到是差不多)
为什么string是不可改变的?
string的定义跟其它类有什么不同吗?(例如StringBuild,不要把string的定义贴出来,说出原因就行了)
其它的类,如果两个对象引用同一实例,改变之一,另一个也会变啊

------解决方案--------------------