也许是关于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的最大优势. 任何团队都可以编写一个软件来满足一组用例的需求,但那些将时间和精力 ...
随机推荐
- BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排
Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...
- front-end
http://info.1688.com/detail/1139720782.html http://segmentfault.com/q/1010000000136513 http://h5apps ...
- 自己写的一个android小应用 手电筒
简洁 小巧 免费 无广告 代码奉上 active类 private boolean isopent = false; private Camera camera; @Override protecte ...
- Hibernate 注解 没有加@Column一样会在数据库创建这些字段
Hibernate 注解 没有加@Column一样会在数据库创建这些字段 如下一个注解类: package com.hyy.hibernate.one_to_many.domain; import j ...
- C#面向对象基础类与方法
C#是纯粹的面向对象编程语言,它真正体现了“一切皆为对象”的精神. 在C#中,即使是最基本的数据类型,如int,double,bool类型,都属于System.Object(Object为所有类型的基 ...
- 【Node】fs
var fs = require('fs') // fs 文件系统 var stdin = process.stdin var stdout = process.stdout var stats = ...
- linux下包管理命令yum与apt-get以及开发环境配置
一般来说市面上常见的Linux系统分为两大类: RH类:Redhat.centOS和Fedora等 Debian类:ubuntu.Debian等. 上述两类系统对应的包管理工具命令分别是yum和apt ...
- load dll
Assembly myassembly = Assembly.LoadFrom("testdll.dll"); Type type = myassembly.GetType(&qu ...
- java Enumeration用法
Enumeration是java.util中的一个接口类,在Enumeration中封装了有关枚举数据集合的方法. 在Enumeration中提供了方法hawMoreElement()来判断集合中是束 ...
- POJ -- 2436
Disease Management Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is run ...