前言

整理很早以前认为的一些误区,准备整理一个系列。新手可以看下,然后大佬指点一下是否哪些地方错了。

正文

值类型存在栈上,引用类型存在堆上

很多人认为用这句话来解释值类型和栈类型的区别,甚至有些文章还公开这样写,把其看做是一种区别。

有这样一个例子,比如说一个类中有一个int类型,请问这个int类型存在堆上还是栈上?

答案是存在堆上。

为什么这么说呢?原因是class的对象是一个引用类型,而类对象的变量的值总是和对象的其他数据在一起,那么就是在堆上。

引用类型在堆上是没有问题的,因为引用类型的确是在堆上建立的。

那么下一个问题,就方法中的值类型存在堆上还是栈上?

存在栈上,那么这个是为什么呢?

因为在代码运行方法里面的程序片段的时候,其实和类对象没有直接关系,间接关系是类对象作为该方法运行的上下文的栈顶。

那么问题来了,是否引用类型可以存在栈上?为什么?

int a=1;a.tostring()和 $"{a}"没有区别?

这个问题是什么时候会发生装箱拆箱问题。

直接能看出装箱和拆箱的就是:object o=a;

那么隐式如何看出呢?

关键就是a 是否调用的是tostring() 是否是int 实现的还是object实现的。

上面这些方法是值得注意的,是调用值类型的方法还是调用的是object 方法,决定是否装箱。

那么问题来了,a+"" 是否发生装箱?

linq中 from 子句中引用的数据源的类型必须为 IEnumerable、IEnumerable<(Of <(T>)>) 或一种派生类型(如 IQueryable<(Of <(T>)>))

其实这个真的不一定,以前我写过一篇。

https://www.cnblogs.com/aoximin/p/13727408.html

如果理解为必须IEnumerable,会陷入一个误区,那就是比如说为了一些对象为了兼容linq,而去实现IEnumerable,这些是完全没有必要。

然后还要一个问题就是,做排序sort用IComparer。IComparer之所以出现,是因为当时需要规范化,里面可以去调用对应的方法进行比较。

但是随着泛型和lambda的出现,一般都是这样写IEnumerable.sort((x,y)=>{

return x.age>y.age;

});

这样的代码更好维护,因为你不比再去关心IComparer(比较器)的修改。IComparer当然具有存在的价值,比如说复杂的比较,复用性也好一点。

属性是变量?

初学的时候,可能有的有吧属性当做变量。

比如说

class person{
public stirng Name{get;set;}
}

因为可以像调用变量一样使用,所有会对属性产生一些误解。

那么看下历史吧:

第一版:

class person{
private string name;
private string Name{
get{return name;}
set{name=value;}
}
}

然后就是:

class person{
private string name;
private string Name{
get;set;
}
}

命名的规范就去掉了一些不必要的操作。

然后就是:

class person{
public stirng Name{get;set;}
}

他们的本质没有变化。

那么为什么使用属性呢?而不是直接使用变量,这其实是编程思维的一个很大的变化。

属性其实是一个接口,是这个对象暴露出去的,而不是直接操作了该对象,体现其封装性。

也就是说该对象是一个盒子,而不是一个可直接操作的东西,任何操作都是在该对象允许的情况下:



下面可以提现其接口性:

class person{
public stirng Name{get;private set;}
}

可以设置set 为私有来关闭修改,提现了对象的主导性,而不是调用者的主导性。

持续更新中,应该有挺多的。

c# 误区系列(一)的更多相关文章

  1. c# 误区系列(二)

    前言 继续整理误区系列,可能会对刚入门的新手有些帮助,然后希望有错误的地方可以指出. 正文 关于泛型方法的确定 class Person<T> { public void add(T a) ...

  2. 豪情-CSS解构系列之-新浪页面解构-01

    目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...

  3. Expert 诊断优化系列------------------内存不够用么?

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  4. Expert 诊断优化系列------------------锁是个大角色

    前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库的诊断和调优方式.加上本篇可以说已经可以完成常规的问题诊断及优化,本篇就是SQL SERVER中的锁.为了方便阅读给出系列文章的导读链 ...

  5. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  6. 【开源】OSharp框架解说系列(5.1):EntityFramework数据层设计

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  7. C#进阶系列——DDD领域驱动设计初探(一):聚合

    前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的 ...

  8. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  9. SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)

    前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块 ...

随机推荐

  1. ORA-00119: ORA-00132: 解决办法 -九五小庞

    问题描述: 1. em打开中提示 https://localhost:1158/em/console/database/instance/repDown?target=orclweng&typ ...

  2. 20190926-02Redis五大数据类型之Set 000 028

  3. 一、loadrunner脚本录制及回放

    录制及回放的注意点: 1.测试系统教复杂时,正确的划分action,对监控的每一个业务模型和操作,起到重要作用 2.录制完成后,先进行编译(改动脚本之后检查下有没有语法错误):工具栏Vuser下有一个 ...

  4. 第一次软件工程与UML作业

    这个作业属于哪个课程 https://url.cn/IMQa18Jo 这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/ ...

  5. hystrix文档翻译之如何使用

    Hello World! 使用HystrixCommand实现“Hello World”. public class CommandHelloWorld extends HystrixCommand& ...

  6. 使用vue-cli(vue脚手架)快速搭建项目-2

    接上一篇文章,这篇文章对如何使用IDEA打开并运行项目做教程 1.将在窗口模式启动的Vue关闭 只需要按住Ctrl+C,输入Y就可以了 2.打开idea 3.复制你项目所在地址,然后点击OK 4.下面 ...

  7. RDS、DDS 和 GaussDB 理不清?看这一篇足够了!

    当前,华为云提供的数据库服务主要包括三大类:关系型数据库服务,非关系型数据库服务以及数据库工具服务.如下图所示: 关系型数据库和非关系型数据库均可分为开源和自研两大类.其中,自研数据库统一为Gauss ...

  8. Java操作Elasticsearch 之 [Java High Level REST Clientedit]

    1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json. 向 Ela ...

  9. l洛谷 P6030 [SDOI2012]走迷宫 概率与期望+高斯消元

    题目描述 传送门 分析 首先判掉 \(INF\) 的情况 第一种情况就是不能从 \(s\) 走到 \(t\) 第二种情况就是从 \(s\) 出发走到了出度为 \(0\) 的点,这样就再也走不到 \(t ...

  10. 一款Java开源的Springboot即时通讯 IM,附源码

    # 开篇 电商平台最不能缺的就是即时通讯,例如通知类下发,客服聊天等.今天,就来给大家分享一个开源的即时通讯系统.如对文章不感兴趣可直接跳至文章末尾,有获取源码链接的方法. 但文章内容是需要你简单的过 ...