首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#传值也许传引用以及其他Tips

2012-09-04 
C#传值或者传引用以及其他Tips一、struct以及以下的基本数据类型,赋值或者函数参数都传递的值(拷贝),除非使

C#传值或者传引用以及其他Tips
一、

struct以及以下的基本数据类型,赋值或者函数参数都传递的值(拷贝),除非使用ref关键字(函数参数)。

?

object的赋值或者函数参数都传递的引用,但是函数参数的时候,传递后的引用相当于一个常引用(不能=new xxx()之类了),如果使用ref关键字,?则这个引用可以自由修改。

也就是说,C#里object和struct以下的基本数据类型传递起来并没有太大不同,只是object变量本身的值就是指的引用(实际对象的地址)。

?

二、?

另外,怀念Delphi的with关键字,于是网上找到一个C#的实现:

首先定义这个extention method

?

    public interface ExtensionsInterfaceToHandleStringResource    {    }    public static class ExtensionsInterfaceToHandleStringResourceImplementaion    {        public static String S(this ExtensionsInterfaceToHandleStringResource @this, string key)        {            // 读取资源字符串            return ret;        }    }

? 这样只要声明自己继承ExtensionsInterfaceToHandleStringResource的类,就都有了S(key)这个extension method。不过要注意,使用S(key)的时候必须加this前缀,即this.S(key),这个没辙了,extension method都这德行(必须是obj.XXX才能使用)。

?

?

六、

原来以为C#跟Java都是认为所有的方法都是virtual的(不根据指针/引用类型调用类定义所在内存的方法,而是根据实际对象的虚函数表寻找方法入口),今天一试,发现C#这方面还是C++之类“静态”语言的习惯,想要实现virtual方法,需要在基类的方法定义上声明virtual。嗯,虽然在关键字上更让人想起delphi,这蛮好的,继承类指明override让代码易读,调用和维护时不易出错。

?

觉得Java那样简化概念蛮好的,毕竟多态一般都是用接口(或父类)指针来调用实现类(或子类)的方法,而至少我都好像没怎么用到过“截断”式的调用。

?

回到C#,如果要用virtual式的(运行时绑定,动态绑定,对象所在内存的虚函数表,常见的Java式接口式多态),在父类方法使用virtual关键字,子类方法使用override关键字;如果要用“截断”式的(编译时绑定,静态绑定,即便是子类对象用父类指针调用也只能调用到父类的方法,方法入口在类的定义所在的内存而非对象所在内存的虚函数表),则父类使用普通方法就行,子类加一个new关键字,表达一个overwrite的意思,在delphi那里,相同情况下用的关键字是reintroduce。

热点排行