日期:2014-05-18  浏览次数:20834 次

来个高手,关于引用类型和COM组件的接口实例
首先给点CODE出来,大家看看。
StringBuilder strbResource = new StringBuilder("qwer");
StringBuilder strbTerminal = strbResource;
strbTerminal = strbTerminal.Replace('q', 'w');
//下面代码将输入wwerwwer
Console.WriteLine(strbResource.ToString() + strbTerminal.ToString());

string _strbResource = "qwer";
string _strbTerminal = _strbResource;
_strbTerminal = _strbTerminal.Replace('q', 'w');
//下面代码将输入qwerwwer
Console.WriteLine(_strbResource.ToString() + _strbTerminal.ToString());

如上,StringBuilder是按引用传递,也就是strbTerminal = strbResource;的实际作用是把对strbTerminal的引用指向了strbResource的内存区.
而string却是一个赋值的过程.

问题是:C#里有哪些类型是如StringBuilder这样传递引用的?是否在这二者之间有更多的区别?

-------------------------------------

第二个问题,跟上面代码无关.

有这样的声明 
interface Type1;
//注意下面这句,从形式上来看是接口实例化了.但是注意,编译器没报错.能正常运行
Type1 myType = new Type1();

//需要说明的是,interface Type1 是一个COM组件封装的接口.

问题是,为什么这里的接口能实例化呢?很奇怪啊.熟悉COM的高手们来指点下啊.万分感谢.本问题60分.没人能说清楚的话,就给上面的问题.
 

------解决方案--------------------
mark
------解决方案--------------------
UP JF
------解决方案--------------------
帮你顶.
------解决方案--------------------
关注!!
帮你顶!!
------解决方案--------------------
除了继承ValueType的类型以外,其他类型都是按引用传递的。

实际上string也是引用传递的。只是string是不会改变的(Immutable),你不用担心别人会更改你的string。比如你不能这样做:

string strA = "hello";
strA[0] = 'J'; // error! strA[0] is readonly

你只能这样得到另一个string:
string strB = strA.Replace('h', 'J');

strA.Replace('h', 'J')本身并不能改变自己。



第二个问题,则是编译器欺骗了你。编译器可以理解一些加在类上面的属性,像[ComImport]等,并在Type1 myType = new Type1(); 的时候,提供了一个Com的代理。

由于它很不直观,现在用TblImp的时候生成C#代理的时候,已经很少只提供Interface的情况了,比如现在创建一个Excel Com代理对象可以这样用:
ApplicationClass excel = new ApplicationClass(); //ApplicationClass是个class定义

不用像以前那样,new Application(),‘实例化’一个接口了。
------解决方案--------------------
String是个引用类型,赋值的时候只拷贝了它的一个副本;StringBuilder比较特殊,因为它的值是可变的,也就是说可以对它进行修改。
------解决方案--------------------
string是引用类型,但是每次a = "1"; a = "2";类似这样的代码其实创建了2个string对象。string对象在创建后就是不可变的。调用Replace方法生成了新的string对象返回给你。