也许是关于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的最大优势. 任何团队都可以编写一个软件来满足一组用例的需求,但那些将时间和精力 ...
随机推荐
- hdu 4764 && 2013长春网赛题解
一个组合游戏题. 解答: 从后面往前面推,首先n-1是必胜位,然后前面的k位是必败位,如此循环下去.所以题目就容易了! 代码: #include<cstdio> using namespa ...
- 用 NSURProtocol 注入测试数据
在之前的几篇博文中,笔者介绍过访问异步网络的单元测试方法及如何使用模拟对象来进一步控制单元测试的范围.在今天的教程中,笔者将展示另一种方法,即:通过自定义 NSURProtocol 类来获取静态测试数 ...
- php 文件下载 以及 file_exists找不到文件的解决方案
链接:<a href="upload/file/download.php?filename=雨人工作室.doc" target="_blank" > ...
- SPRING IN ACTION 第4版笔记-第一章-002-DI介绍
一. 1.knight.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- 【Xamarin挖墙脚系列:最重要的布局ListView】
原文:[Xamarin挖墙脚系列:最重要的布局ListView] 安卓的几个重要的布局 线性布局 相对布局 Table布局 Tab布局 表格Grid布局 列表布局. 这几种基本的布局的方式,最重要 ...
- 计算机中的大小端模式及C语言中如何鉴别他们
我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...
- 一个优秀的http实现框架
package com.ming; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unir ...
- logstahs 匹配isslog
2016-11-30 06:33:33 192.168.5.116 GET /Hotel/HotelDisplay/cncqcqb230 - 80 - 192.168.9.2 Mozilla/5.0+ ...
- android开发板
element14-beaglebone-black http://www.embest-tech.cn/shop/star/element14-beaglebone-black-rev-c.html ...
- 使用IAR6.1调试LPCXpresso-cn
由于Manly公司驱动兼容性问题,下载破解版的IAR6.1 使用. http://blog.sina.com.cn/s/blog_48bde2b20101e6v0.html 然后使用IAR打开示例wo ...