问题描述
c++中类的函数有const结尾的,如下:表示该函数为只读,不会修改类本身成员数据。c#中就没有了。classCGeMatrix3d{public:CGeMatrix3d&invert();CGeMatrix3dinverse()const;private:intm_iInfo;}如上,上面2个函数其实功能一样的,都是求解逆矩阵。只是一个把自身给逆了(invert函数)。另外一个自身不变,但返回新产生的逆矩阵(inverse函数)。这样很好啊,//为什么c#中就只能写成classCGeMatrix3d{public:CGeMatrix3dinvert();CGeMatrix3dinverse();private:intm_iInfo;}这样的话,调用者都无法知道哪个函数会改变自身,哪个不会。有没有办法
解决方案
本帖最后由 genguo 于 2016-03-21 09:24:13 编辑
解决方案二:
函数自身不变?有这种说法吗?你可以参考C#中的ref,out关键字
解决方案三:
楼上估计没写过c++程序,c++中就可定义函数为只读的。明确表明了该函数的调用不会影响类本身。
解决方案四:
引用2楼genguo的回复:
楼上估计没写过c++程序,c++中就可定义函数为只读的。明确表明了该函数的调用不会影响类本身。
我是没写过C++,不过你看看ref和out应该就能明白了
解决方案五:
引用3楼andywangguanxi的回复:
Quote: 引用2楼genguo的回复:
楼上估计没写过c++程序,c++中就可定义函数为只读的。明确表明了该函数的调用不会影响类本身。我是没写过C++,不过你看看ref和out应该就能明白了
很大区别的。。。const写在类函数声明的后面表示这个函数不能对类成员进行修改这个功能我没在C#中看到过,估计是没有了
解决方案六:
引用4楼u012948520的回复:
很大区别的。。。const写在类函数声明的后面表示这个函数不能对类成员进行修改这个功能我没在C#中看到过,估计是没有了
是没看到过,不好意思
解决方案七:
如上,上面2个函数其实功能一样的,都是求解逆矩阵。只是一个把自身给逆了(invert函数)。另外一个自身不变,但返回新产生的逆矩阵(inverse函数)。这样很好啊这个在C#中应该是没有通过一个关键字(比如C++的const)就能实现象上面你举的这个例子,只能分别实现了,比如这个不需要自身改变的,可以深度克隆一个新的矩阵,对其做逆序返回
解决方案八:
C#没有CGeMatrix3d&invert();这种语法。C#很多函数如果要修改自身的话,会返回一个新的对象。
解决方案九:
这种成员方法在.NET中叫“纯方法”,可以为方法加上PureAttribute特性(需要4.0以上版本的框架)。参见https://msdn.microsoft.com/zh-cn/library/system.diagnostics.contracts.pureattribute(v=vs.110).aspx
解决方案十:
其实这个问题本身不是实现问题,如何用c#实现我也知道。而是涉及代码可读性问题。c#中如果我不说哪个函数是返回自身,哪个是新克隆的。CGeMatrix3dinvert();CGeMatrix3dinverse();这两个函数你能区分出哪个是哪个吗。如果函数末尾能加const,就能明确知道哪个是哪个了。外加上上良好的函数名称的命名。就能有很好的可读性
解决方案十一:
既然是不改变当前实例的状态,那直接写个静态方法不就完事了,这种事多得很Object.Eqeals(),不就有成员方法和实例方法吗?只不过你那个事构造函数,特殊一点罢了,invert()本来就应该作为实例方法,构造函数就应该只干构造函数的事情从来不以为少写个方法调用,代码就会变得高明,反而只会让人看不懂
解决方案十二:
刚看了下MSDN,那个PureAttribute编译器没有作强制检查,只是一个辅助性的标识,给调用者看的
解决方案十三:
引用9楼genguo的回复:
其实这个问题本身不是实现问题,如何用c#实现我也知道。而是涉及代码可读性问题。c#中如果我不说哪个函数是返回自身,哪个是新克隆的。CGeMatrix3dinvert();CGeMatrix3dinverse();这两个函数你能区分出哪个是哪个吗。如果函数末尾能加const,就能明确知道哪个是哪个了。外加上上良好的函数名称的命名。就能有很好的可读性
仔细想想,c++的“CGeMatrix3dinverse()const;”只是告诉你这个接口不会修改成员你也不能一眼看出它返回的是不是克隆,而是需要以自己的经验才能判断所以良好的文档才是正确的解决方案
解决方案十四:
引用12楼shingoscar的回复:
Quote: 引用9楼genguo的回复:
其实这个问题本身不是实现问题,如何用c#实现我也知道。而是涉及代码可读性问题。c#中如果我不说哪个函数是返回自身,哪个是新克隆的。CGeMatrix3dinvert();CGeMatrix3dinverse();这两个函数你能区分出哪个是哪个吗。如果函数末尾能加const,就能明确知道哪个是哪个了。外加上上良好的函数名称的命名。就能有很好的可读性仔细想想,c++的“CGeMatrix3dinverse()const;”只是告诉你这个接口不会修改成员你也不能一眼看出它返回的是不是克隆,而是需要以自己的经验才能判断所以良好的文档才是正确的解决方案
c#在避免c++的复杂性。c#里面const不能修饰一个对象。c++却可以用来修饰指针。还可以修饰方法。如果一个类只有私有字段,那么这些私有字段是不应该对外开放的。也就是说其他类不知道这些私有字段的存在。你现在在一个方法后面加上const声明,表明此方法不会修改这些私有字段。这样的意义何在?有没有私有字段,调用类都不在乎,还在乎你修改私有字段吗?明显把内部实现暴露给了外部类。所以不要这个功能是正确的。