也许是关于C#的一些常见误区
写这点东西主要是看到知乎上有人在讨论相关的问题,但是有不少人都在说一些不严谨,甚至是完全错误 但是流传甚广的东西,甚至是一些大神都在说,以下根据我的回答总结。
一个很常见又很低级的误区是:认为引用类型保存在堆上,值类型保存在栈上……其实这个问题幼稚得我懒得说……但是实在又忍不住吐槽。
很多人都在说这句话,甚至很多初学者把他当成金科玉律。实际上第一句话是正确的,但值类型的保存位置是要看上下文的,应该说值类型保存在他的声明位置。比如在一个类里声明一个Int a,a此时当然是保存在堆上的。只有局部变量和方法参数(在C#1中)总是保存在栈上,在C#2以后局部变量很多也不完全在栈上了。
其实以上所有都没有在C#规范中硬性规定,不过CLR总是这么做的。
第二个问题也是昨天知乎上很多人在扯的,所谓“C#中的对象默认是引用传递的”。
首先……引用传递和传递引用完全不是一回事…… 引用传递和值传递是一种求值策略,正式定义解释起来比较麻烦,不过正常计算机专业本科生应该会知道,不知道的去谷歌……
(
顺便吐槽一下,在java里只有值传递这一种情况,而C#中可以用ref out标识是引用传递还是值传递,另外,如果不想或者不能用值类型的值,在C#里也可以通过装箱和拆箱来实现,就语言特性来客观的来说,C#甩了java一百条街,所以用C#可以写出非常风骚的代码,同时也能从语言层面较好的规范(不合格的)程序员。
)
实际上正好相反,如果没有ref out标识符的话,事实上基本都是值传递。
写了这么多了不想写了……最后再安利一下,C#是一门特别甜的语言,非常多的糖,非常多的特性,别说特性可以模拟,是可以模拟,但你是愿意写一大堆丑陋的东西去模拟还是用一个干干净净的关键字呢?而且有些特性你也模拟不了,比如c#里的dynamic,当然c#并不是一个原生的动态语言,总会有一些缺陷,但是比起大多数静态语言的动态特性要强太多了。
哦对了,我突然又想起一点。
关于隐式类型和匿名类型很多人有莫名其妙的性能担心。
比如:
var 3ds = { comment = "good", price = "1000" }
var psv = { comment = "terrible" prive = "1500"}
这两个匿名类型 第一,在编译阶段就已经完成了,他们的属性也是普通属性,并不会发生动态查找,第二,编译器会将他们编译成同一种类型,你可以试试3ds = psv ,是可以通过的(当然我心理上不接受)。
另外像这样的匿名方法:
Func<int,int,string> pixel = (x,y) =>(x*y).ToString();
也只是一个普通的函数,不需要产生性能担心。他只是很甜而已。
不过要说的是当委托无法释放的时候事件也无法被GC回收,这一点需要注意。
不说了!写了这么多。
也许是关于C#的一些常见误区的更多相关文章
- NODE.JS学习的常见误区及四大名著
NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...
- 绝对定位常见误区:position:absolute相对于谁定位、及当溢出时怎么隐藏
1.绝对定位元素溢出父元素,怎么隐藏问题? 通常,为了让DIV子元素超出部分隐藏,都是在父元素设置overflow:hidden,这样即可防止子元素撑开父元素,使子元素能够溢出隐藏! 但是,对于pos ...
- nginx反向代理跨域基本配置与常见误区
最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器.同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决问题的同时,发现网上有些方案的确是存在一 ...
- 【原创】C语言和C++常见误区(一)
本文仅在博客园发布,认准原文地址:https://www.cnblogs.com/jisuanjizhishizatan/p/15414469.html 问题1:int类型占几个字节? 常见误区:占4 ...
- JavaScript的一些常见误区
原文出处: 色拉油的博客 接触JavaScript两年多遇到过各种错误,其中有一些让人防不胜防,原来对JavaScript的误会如此之深,仅以此文总结一下常见的各种想当然的误区. String r ...
- oc常见误区
1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...
- Java的常见误区与细节
网上转来的 昨天整整一天,我都都呆在图书里.本打算找一些书学习“正则表达式”,很失望,没找到有这部分的内容的书.发现了一本<Java深入解析>,其中涉及了很多平时没有注意的一些误区,也许开 ...
- Lodop客户端本地角色注册号常见误区
之前写过一篇关于Lodop和c-lodop注册号的区别:LODOP.C-LODOP注册号的区别第一种角色客户端本地打印角色是最常见的角色,最常见的场景,关于c-lodop云打印,它的第一种角色是取代L ...
- DDD学习笔录——领域驱动设计的常见误区(即错误的理解)
可以将DDD看成一种开发思想体系:它促成了一种新的以领域为中心的思维方式. 它是一种学习过程,而非最终目标,这就是DDD的最大优势. 任何团队都可以编写一个软件来满足一组用例的需求,但那些将时间和精力 ...
随机推荐
- 修改 Analysis Service 服务器模式
原网址:http://cathydumas.com/2012/04/23/changing-an-analysis-services-instance-to-tabular-mode/ Say you ...
- POJ 2992 Divisors
每个数都可以分解成素数的乘积: 写成指数形式:n=p1^e1*p2^e2*...*pn^en:(p都是素数) 那么n的因数的数量m=(e1+1)*(e2+1)*...*(en+1): 所以用筛选法筛出 ...
- Android 向系统发送一条短信
s //向系统写一条短信 ContentValues contentValues = new ContentValues(); contentValues.put("body",& ...
- [wikioi]数的划分
http://wikioi.com/problem/1039/ 划分型DP.最终的思路是,F[i][j]表示i分成j份,如果分出来的有1,那么去掉1,就是F[i-1][j-1]:如果没有1,那就都减1 ...
- ASPX在Debug模式下直接link原始CSS而非Bundle后的CSS
由于对CSS做了bundle, debug的时候修改原始css文件不会直接反映到浏览器中, 效率较低. 于是我想在debug的时候直接link原始CSS. 很简单. <% #if DEBUG % ...
- asp.net中bin目录下的 dll.refresh文件
首先找到了这篇文章http://www.cnblogs.com/haokaibo/archive/2010/07/31/1789342.html 然后找到一篇英文的文章http://monsur.xa ...
- xmanager远程登录
- Cookies和Session理论总结
今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Sessi ...
- java中Pattern.compile函数的相关解释
Pattern.compile函数:Pattern Pattern.compile(String regex, int flag) flag的取值范围如下: Pattern.CANON_EQ,当且仅当 ...
- Linux下Chrome浏览器的BUG
“我胡汉三又回来了”,好久没出现在博客园了,准备考试什么的最烦躁了,今天又重新整了下我的Ubuntu,结果发现了一个Chrome浏览器的Bug,但是与其说它是个Bug,还不如说它是个Joke. 好吧, ...