常被人误解的基础知识(一)C#

  • 对值类型和引用类型的误解(引用类型存储在堆上,值类型存储在栈上)

在学习C#基础篇幅的时候总是逃不掉值类型和引用类型,很多新手包括我以前对它的理解也只是停留在"引用类型存储在堆上,值类型存储在栈上".

这个误区主要归咎于我们根本没有动脑筋,第一句话是正确的,引用类型的实例总是在堆上创建的.但后一句就有问题了.设想假定一个类中有一个int类型的实例变量.

(如下代码)

1     public class Person
2     {
3        public int Age { get; set; }
4     }

那么在这个Person类中的该变量的值总是和对象中的其它数据在一起,也就是在堆上.事实上只有局部变量和方法参数在栈上,但是对于c#2.0更高版本,很多局部变量并不完全存放

在栈上,比如匿名函数闭包,这些特性不适合新手这里就不说明了.

  •    Var是动态类型吗?

     这个问题对于JavaScript程序员才学C#的时候很容易混淆.虽然C#不是完全的强类型语言(C#4.0以上允许你使用动态类型),但在C#3.0以下基本还算是强类型语言

在说明var的关键字之前,需要大家知道的是 C#2.0是对CLR进行了改动,但在随后面的版本基本都没发生重大的改动,这意味着很多特性都是编译器在默默的帮助你,

比如C#3.0引入Var类型.为了更好的说明Var不是动态类型我还是引入一个实例

1         static void Main(string[] args)
2         {
3
4             var str = "Hello, world.";
5
6             str = 10;
7
8         }

上述代码是无法通过编译的,编译器会告诉你" 无法将类型“int”隐式转换为“string".

因为str的类型是String,在你写申明str变量的时候就已经确定了类型了,那么var到底有什么用呢?

之所以使用Var隐式类型,原因很简单,它减少代码的输入量,这意味增加了可读性,尤其在涉及泛型时,类型名称变的相当长,我还是引入一个实例

1       static void Main(string[] args)
2         {
3
4             //未使用var变量前
5             Dictionary<List<int>, IEnumerable<Person>> dic1 = new Dictionary<List<int>, IEnumerable<Person>>();
6
7             //使用var变量后
8             var dic2 =new  Dictionary<List<int>, IEnumerable<Person>>();
9         }

可以看出使用了var的变量确实可读性更好了,还减少了代码量(但是并不是在任何地方都可以滥用var类型)

在声明dic2变量的时候,实际上它是在编译时就确定了类型,而不是发生在运行时,为了证明这点你可以把鼠标光标移到到var上 VS就会提示你使用的类型

如图

这也证明了它确实在编译时就确定了类型,只是编译器帮你变的魔术而已.如果还是感到怀疑的同学可以声明一个var number; 试试看看它是否能通过,答案肯定是否定的

因为编译器是在编译时推断的,所以它肯本不知道这是什么东东,这样它的魔法就失灵了.

还要说明的是var不是所有的场景都可以推断,实际上它有缺点,这里就不列出了.

不要滥用var隐式类型

例子说明

    static void Main(string[] args)
        {

           //不能直观的知道number是什么类型
            var number = getValue();

        }

上面的代码在维护的时候不能直观的知道number是什么类型的变量,而需要将光标移到var上才能知道.影响阅读

好了 暂时就说这么多了,先洗洗睡了.如果基佬们喜欢,我后面还会列出更多常见误区,如果有什么说的不对的地方

欢迎大家一起切磋切磋共同学习.

   

时间: 2024-08-04 09:04:35

常被人误解的基础知识(一)C#的相关文章

常让人误解的一道js小题

今天无意中看到一个js笔试题,不由得想起初学js那会被各种题目狂虐的心酸,虽说现在也会被笔试题所虐,但毕竟比之前好了很多,至少对于这道题我还是能正确解答上来的: var x = 1; function printx(){ console.log(x); } function show(f){ var x = 2; (function(){ f(); })() } show(printx); //1 结果后台会打印1,而不是2.这有些不合常理,因为很多人会错误的认为:函数show中的f()在执行时

C语言基础知识----易让人头疼的关键字----const &amp;&amp; typedef &amp;&amp; define

const关键字 const=read only,修饰的为只读变量而不是常量.const修饰的变量不能用作数组的维数也不能放在switch语句的case:之后. 主要作用有: 1.通过把不希望被修改的变量或参数用const来修饰,编译器会保护这些变量不被修改增强系统的可靠性: 2.增强代码的可读性 [html] view plaincopyprint? const int a;      //a为常量不能被修改 int const a;      //a为常量不能被修改 const int *a

SEO基础知识_绝密教程

<p align="center"> </p> <p>   </p> <p align="center"> 第一次接触SEO,请阅读本基础指南入门,也可以注册论坛:<a  1-1.html" target="_blank"><span style="color:black;">从一句话入门</span><span s

音视频编码基础知识

本文转载自 http://blog.csdn.net/ljzcom/article/details/7336258 ,如有需要,请移步查看. Technorati 标签: 音视频 编码 基础知识 --------------------------------分割线开始----------------------------------------------- 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中

3.Swift基础知识

Swift是用来开发iOS和OS X应用的新语言,但是许多地方用起来跟C或者OC是差不多的. Swift提供了C语言和OC的基本数据类型,比如整型用Int,浮点型用Double或者Float,布尔型用Bool,字符串文本用String,Swift还提供了两种集合类型,Array和Dictionary,后面会介绍. Swift也跟C一样用唯一的变量名来存储与使用数据,还能使用一些值不会变的变量,应该说是常量,比C里面的常量要强大.在涉及到一些值不会发生变化的数据时使用常量类型能让代码更安全整洁.

网络基础知识查询

第一章.基础网络概念 1.1 网络是个什么玩意儿 全世界的人种有很多,人类使用的语言种类也多的很.那如果你想要跟外国人沟通时,除了比手划脚之外,你要如何跟对方讲话? 大概只有两种方式啰,一种是强迫他学中文,一种则是我们学他的语言,这样才能沟通啊.在目前世界上的强势语言还是属于英语系国家, 所以啰,不管是啥人种,只要学好英文,那么大家都讲英文,彼此就能够沟通了.希望不久的未来,咱们的中文能够成为强势语言啊! 这个观念延伸到网络上面也是行的通的,全世界的操作系统多的很,不是只有 Windows/Li

C#基础知识篇(四)-----------C#笔记

一.类 1. 什么叫做类? 类是具有相同特征的一类事物统称.所以类是一种抽象,即不是一个实体(我们把类看做模板). 2. 什么叫做对象? 对象是根据类的模板创造出来的一个实体,它具有类里所有的特征,一个也多不得,一个也少不得.少了就不叫这个类的成员了,多了也不是!假如张三有变身这个功能,那么张三就不属于人. 记住对象是根据模板创建的,模板有什么它就有什么,不会多也不会少! 3. 什么叫做字段(或者是成员变量)? 我们把定义在方法的外面,类的里面(即:类中)的变量称之为字段或者说是成员变量. 4.

mysql 的常见语句总结和其他基础知识

一下为从视频和其他教程的总结.文章内大部分为传播智客的mysql记录.特此声明. C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -p1234 mysql复习一:复习前的准备1:确认你已安装wamp2:确认你已安装ecshop,并且ecshop的数据库名为shop 二    基础知识:1.数据库的连接mysql -u -p -h-u 用户名-p 密码-h host主机 2:库级知识2.1 显示数据库: show databases

马哥2013年运维视频笔记 day01 系统基础知识

没有什么可说的,马哥的Linux视频真的是精品,这里把我学习以后的笔记整理到这里,以备不时之需. day01 ①.Linux学习的一些方法论 做好总结,必须学习完一个知识点以后要用自己的思想把它彻底的给别人讲明白,这样这个知识就真的融入你们的知识体系了,否则看着会了,其实是一知半懂.比较好的方法就是写总结,记笔记,然后汇总成博客,这样可以锻炼你对问题条理化理解,这会影响你们的一生,是隐形的影响. 都说Linux很难,不然怎么体现你的价值啊?只有基础打牢,之后的中高级内容才能从容不迫.要做好知识结