也许是关于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的最大优势. 任何团队都可以编写一个软件来满足一组用例的需求,但那些将时间和精力 ...
随机推荐
- NWERC 2012 Problem J Joint Venture
刚刚开始想的是用二分的方法做,没想到这个题目这么水,直接暴力就行: 代码: #include<cstdio> #include<algorithm> #define maxn ...
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-005-Bean的作用域@Scope、ProxyMode
一. Spring的bean默认是单例的 But sometimes you may find yourself working with a mutable class that does main ...
- Aptana Studio 安装
Aptana Studio 是一个集成式的Web应用程序开发环境,它不仅可以作为独立的程序运行,而且还可以作为Eclipse插件使用. AptanaStudio是一个基于Eclipse的集成式Web开 ...
- windows 挂载windows 共享盘为本地磁盘
我们在设置数据库自动备份时,为了数据的安全往往需要直接将数据备份到远程服务器上.在Linux可以通过NFS挂载来实现,在Windows平台可以直接通过net use+subst来实现将远程服务器的目录 ...
- TeeChart中Axis的CalcIncrement属性
private void Init() { tChart = new TChart(); panel1.Controls.Add(tChart); tChart.Aspect.View3D = fal ...
- ☀【CSS3】icon
Navicon Transformicons: Animated Navigation Icons with CSS Transformshttp://sarasoueidan.com/blog/na ...
- Android-RC4的加密解密代码
static String RC4(String keys, String encrypt) { char[] keyBytes = new char[256]; char[] cypherBytes ...
- android学习——环境搭建之HelloWorld
一.在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.1.JDK安装 1.2.Eclipse安装 1.3.Android SDK安装 ...
- Oracle11g客户端for centos 5.5安装文档
前提:安装centos的时候,最好把系统的所有的安装包都安装上.以下命令需手动输入,不要复制粘贴. 1.以root用户登录centos5.5的操作系统:创建oracle用户组和用户. groupadd ...
- HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)
Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在 ...