C#很简单而又很经典的一句代码实例
一.知识点
二.问题
如果以上四个问题,你很自信,那么以下,您就不要看了,因为我想说的东西真的很简单。
如果你开始怀疑自己,可以继续向下看。你自己到底真的理解吗???
再看下面这段代码有没有问题?
class Program { static void Main(string[] args) { Transform t = new Transform(); t.v.x = 1; t.ShowV(); Console.Read(); } } struct Vector { public float x; public float y; public float z; } class Transform { public Vector v { get; set; } public void ShowV() { Console.WriteLine(v.x+"..."+v.y+"..."+v.z); } }
如果你觉得没有问题,那么你需要看看。这时候会编译报错,为啥,怎么回事。
第6行编译报错:
三.分析
如果你非常清楚属性的本质的话,那么上述代码可以进行转换,将属性转换为普通方法。(属性的本质就是方法嘛)
class Program { static void Main(string[] args) { Transform t = new Transform(); t.GetVector().x = 1; t.ShowV(); Console.Read(); } } struct Vector { public float x; public float y; public float z; } class Transform { public Vector v; //set public void SetVector(Vector v) { this.v = v; } //get public Vector GetVector() { return v; } public void ShowV() { Console.WriteLine(v.x + "..." + v.y + "..." + v.z); } }
果然上述的改写只是将属性的写法转为本质写法-写成两个普通的方法。结果还是报一样的编译错误。
,编译报错提示还是一样的CS1612
再修改一下
Transform t = new Transform(); // t.GetVector().x = 10; 这边编译报错 Vector v2 = t.GetVector(); v2.x = 10; t.ShowV(); Console.Read();
编译打印结构是 0..0..0。
压根就没变,当然没有变啊,因为v2是副本,你更改的只是副本,并没有改变t中的v,同理,通过t.GetVector()也是一个副本,没有意义。所以C#语法在对于这种情况,帮我们做了一个处理,如果写了这样的代码,直接给出编译报错。C#还是很智能的。就是如果我们错误的进行一个无意义的操作,会直接给出提示。这里给C#语法赞一个。
四.杂谈
这一段代码虽然好像很简单,但是真的藏的很深,楼主工作三年。记得曾经有一次去网易二面,被一个大佬问到这个问题,懵逼了,就乱猜吧,一开始说,那个枚举值中的x只是get,没有set。然后大佬提示我不是的,然后我才误打误撞,恍然大悟,是因为枚举值传递是副本传递,再进行赋值操作没有意义。现在想想,能出这个问题的大佬,真的很强,一道很简单的问题,但是考察的东西真的很多很多。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
您可能感兴趣的文章
- 01-10C#实现简单的Login窗口实例
- 01-10Winform消除button按下出现的虚线简单实现方法
- 01-10winform简单缓存类实例
- 01-10C#一个简单的定时小程序实现代码
- 01-10C#圆角窗体简单实现方法
- 01-10C#使用Mutex简单实现程序单实例运行的方法
- 01-10C#实现简单合并word文档的方法
- 01-10C#简单实现子窗体向父窗体传值的方法
- 01-10基于C#实现简单离线注册码生成与验证
- 01-10C#编程自学之开篇介绍
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什