wlan为什么会支付宝存在安全风险险?用不了

问下C#新人这两本书买哪个好?_c#吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:102,198贴子:
问下C#新人这两本书买哪个好?收藏
新学期刚开的C#,机房都是vs2013,我是买2013版的书学习,还是买最新的学习?
【中建瑞通】建筑资质新办,资质增项,资质升级的好帮手
另外,适合学习C#的书求推荐~
都别买。《C#入门经典》第5或者6版和《C#图解教程》第4版。不过书只是工具,不看也白搭。
还有,《XX从入门到精通》这种书名的书,基本都不值那个价。
大部分书网上都能找到资源 先大概看看内容再决定买不买吧
C#6.0本质论
我家孩子也在这学跆拳道呢
VS只是个工具,没啥变化(你能用到的功能和操作方式),所以你只是买本关于C#语言的入门书而已。推荐:①《深入理解C#》②《C#本质论》、《C#入门经典》、国内的《图灵原创:Learning hard C#学习笔记》也不错,出自博客园超人气博主、微软MVP、NET软件开发工程师李志力作
最好有具体的小项目或例子 直接啃理论会看睡着的,像clr那本书入门根本看不懂的
学学mvc框架
这个是大部分中小型公司
用的开发框架
出来找工作比较好找
微软官网上的Bob Taber的视频教程不错,但是是英文视频还没字幕(我是不会告诉你B站有熟肉的)
看视频有用
从入门到放弃
那还要买书,网上资源多的是,花那冤枉钱干嘛
不好。如果有C系基础可以直接上c# in depth和CLR VIA C#。不懂的可以直接跳。
看那本书都行,主要是思想
推荐c#图解教程
head first C#
基本上就是C#图解,headfirst C#,C# in depth,CLR VIA C#这几个
同推荐图解教程
c#本质论,不管是菜鸟,还是大神都很受用,第6章后开启萌新劝退模式
《Head First C#》这本不错哦
个人建议:先找本简单的薄的书入门,这样不会把你的积极性给磨没了 , 入门后再买本厚的当工具书用,使用那个技术去看那个。
玩c#好几年没买过一本书。都是在博客上学学。
看书没什么用,建议去看视频。我一刚开始也是看书,结果看了就忘了,甚至一头雾水,知其然不矢所以然。你可以去传智播客的官网上下载所有.net视频,讲得还蛮详细的,到后面也会有开发项目的教程。对新手入门还是挺好的
我能说我们c#的学习是没有书的吗~~~
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或CLR via C#(8)
今天看到第8章——方法
1.实例构造器和类
构造器方法在“方法定义元数据表”中叫.ctor 创建一个实例时,首先分配托管堆内存,再初始化附加字段(类型对象指针和同步索引块),最后就是调用类型的实例构造器来初始化对象字段。
注意:不要在构造器中调虚方法。因为实例化的进程是先基类初始化再到派生类的初始化,如果在调用基类的构造器时,调用了虚方法,而派生类又重写了虚方法,这时就会产生意想不到的变化,由于此时还没调用派生类的构造器,所以派生类的字段还没初始化,很容易出现意料之外的变化。
2.实例构造器和结构
C#编译器不会为值类型生成默认的构造器。如果必须要编写构造器的话,就必须编写带参数的构造器,同时必须在构造器中初始化全部字段。而定义一个结构类型的变量时,C#编译器不会调用构造器,必须显式调用构造器。
3.类型构造器
也称静态构造器,而且总是私有的,不能显式添加private,因为静态构造器是由CLR调用的。
类型构造器只能访问到静态字段,而且在类中定义静态字段,CLR最终生成的IL会显示一个.cctor的方法,并且静态字段的初始化放在里面。
类型构造器只有在初次访问类的成员时才会加载类到AppDomain,并且调用。
4.操作符重载
CLR没有操作符重载的概念,操作符重载本质上也就是一个静态方法。
5.转换操作符方法
6.扩展方法
扩展方法其实就是一个静态方法,不过其第一个参数的形参上要添加this关键字,并且只有第一个参数才能用this标记。同时扩展方法必须定义在顶级类中,不能在嵌套类中定义,还有潜在的版本问题,也就是说,假如Microsoft以后扩展了某个类的方法,同时我们之前也扩展了相同的方法名,那么编译器就会调用Microsoft的方法,而不是我们定义的方法。
7.分部方法
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3279次
排名:千里之外
原创:10篇带着问题读CLR via C#(笔记二)类型基础
字体:[ ] 类型:转载 时间:
A1: Object类型共包含6个方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize.
Q1: Object类型包含哪些方法?
A1: Object类型共包含6个方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize.
Q2: new一个对象的过程是什么?
A2: 1)计算对象所需字节数,包括该类型及其基类型定义的所有实例字段所需的字节数和类型对象指针、同步块索引所需字节数,类型指针和同步块索引是CLR用来管理对象的;2)在托管堆上分配该对象所需内存空间;3)初始化类型对象指针和同步块索引;4)执行构造函数。大多数编译器都在构造函数中自动生成一段代码调用基类构造函数,每个类型的构造函数在执行时都会初始化该类型定义的实例字段。5)返回指向新建对象的一个引用,保存在对象变量中。
可用如下代码验证第四步:
代码如下:View Code & class Program&&&& {&&&&&&&& static void Main(string[] args)&&&&&&&& {&&&&&&&&&&&& TestThree t = new TestThree();&&&&&&&&&&&& Console.Read();&&&&&&&& }&&&& }&&&& class Test&&&& {&&&&&&&&&&&&&&&& public int I { }&&&&&&&& public Test()&&&&&&&& {&&&&&&&&&&&& Console.WriteLine("This is Test's constructor");&&&&&&&& }&&&& }&&&& class TestTwo : Test&&&& {&&&&&&&& public TestTwo()&&&&&&&& {&&&&&&&&&&&& Console.WriteLine("This is TestTwo's constructor");&&&&&&&& }&&&&&&& &&&& }&&&& class TestThree : TestTwo&&&& {&&&&&&&& public TestThree()&&&&&&&& {&&&&&&&&&&&& Console.WriteLine("This is TestThree's constructor");&&&&&&&& }&&&& }
执行结果如下:
Q3: 父类型和子类型间如何进行转换?
A3: C#允许将一个对象从它的本身类型转换为它的父类型,这是安全的,不需要做任何额外操作,但要将一个对象从它的本身类型转换为它的子类型,则必须要显式转换,因为可能会失败。见代码:
代码如下:View Code & class Program&&&& {&&&&&&&& static void Main(string[] args)&&&&&&&& {&&&&&&&&&&&& Person person = new Person();&&&&&&&&&&&& Man man = new Man();&&&&&&&&&&&& Person p =&&&&&&&&&&&& Man m =&&&&&&&& }&&&& }& class Person&&&& { }& class Man : Person&&&& { }
这段代码是无法编译通过的,在Main方法的第四行会报一个这样的错误:
Error 1 Cannot implicitly convert type 'TypeBasic.Person' to 'TypeBasic.Man'. An explicit conversion exists (are you missing a cast?) C:\Users\Allen\Documents\Visual Studio 2012\Projects\TypeBasic\TypeBasic\Program.cs 16 21 TypeBasic
很显然,一个 “男人” 一定是一个人,故可以直接转换,但一个 “人” 并不一定是一个 “男人”,所以必须要显式转换。可将代码这样改写:
代码如下:// FromMan m =
// ToMan m = (Man)&&&&
这样就可以成功通过编译,但是在运行的时却抛出了异常,很显然,Person不能被转换为Man. 什么情况下Person可以被转换为Man? 见如下代码:
代码如下:View Code &&&&&&&& static void Main(string[] args)&&&&&&&& {&&&&&&&&&&&& Man man = new Man();&&&&&&&&&&&& Test(man);&&&&&&&& }&&&&&&&& static void Test(Person p)&&&&&&&& {&&&&&&&&&&&& Man m = (Man)p;&&&&&&&& }
Q4: is和as操作符的作用是什么?
A4: is操作符用来判断一个对象是否属于某种类型,返回一个布尔值。改写下上例的Test方法: 代码如下:View Code &static void Test(Person p)&{&&&& if (p is Man)&&&& {&&&&&&&& Man m = (Man)p;&&&& }&}
以上代码共进行了两次类型检测,is操作符首先检测p是否为Man类型,在if的方法体中进行强制转换时,CLR会再次检测p的类型,这对性能有一定影响。
as操作符很好的解决了这个问题,再次改写Test方法: 代码如下:View Code & static void Test(Person p)& {&&&&& Man m = p as M&&&&& if (m != null)&&&&& { &&&&&&&&& //...&&&&& }& }
as操作符在检测p的类型后会直接对p进行类型转换,返回一个Man类型的对象,若检测出p不是Man类型,则会返回null. 整个过程只进行了一次类型检测。
Q5: 什么是命名空间?
A5: 命名空间是对类型的逻辑分组,对于编译器而言,命名空间的作用是使类型名称变得更长更具唯一性,但CLR并不知道命名空间,访问一个类型时,CLR需要知道该类型的全名以及它所在程序集。
Q6: 命名空间和程序集之间的关系是什么?
A6: 命名空间和程序集间并没有什么关联,同一命名空间的类型可以存在于不同程序集,同一程序集中的类型也可以属于不同命名空间。
Q7: 分析以下代码执行时CLR发生的动作。
代码如下:View Code &namespace TestConsole&{&&&& class Program&&&& {&&&&&&&& static void Main(string[] args)&&&&&&&& {&&&&&&&&&&&& E&&&&&&&&&&&& Int32&&&&&&&&&&&& e = new Employee();&&&&&&&&&&&& e = Employee.Lookup("Joe");&&&&&&&&&&&& year = e.GetYearsEmployed();&&&&&&&&&&&& e.GenProgressReport();&&&&&&&& }&&&& }&&&& class Employee&&&& {&&&&&&&& // 实例方法&&&&&&&& public Int32 GetYearsEmployed() &&&&&&&& {&&&&&&&&&&&& //...&&&&&&&& }&&&&&&&& // 虚方法&&&&&&&& public virtual string GenProgressReport()&&&&&&&& { &&&&&&&&&&&& //...&&&&&&&& }&&&&&&&& // 静态方法&&&&&&&& public static Employee Lookup(string name)&&&&&&&& { &&&&&&&&&&&& //...&&&&&&&& }&&&& }&&&& class Manager : Employee&&&& {&&&&&&&& // 对父方法重写&&&&&&&& public override string GenProgressReport()&&&&&&&& {&&&&&&&&&&&& //...&&&&&&&& }&&&& }&}
1)CLR检查该方法内部引用的所有类型(Employee, Int32, Manager, String),确保定义了这些类型的程序集已成功加载;
2)CLR利用程序集的元数据提取这些类型的相关信息,并创建一些数据结构来表示类型本身,如下图所示:
3)执行"序幕代码",在线程栈中为局部变量分配内存,并初始化它们,如下图所示:
4)构建Manager对象,在托管堆中创建一个Manager类型的实例,CLR会初始化该实例的类型对象指针,让它引用与实例对应的类型对象,本例中为Manager类型对象;此外CLR会初始化同步块索引,并将该实例所有实例字段设为null或0,再调用构造函数,new操作符会返回该实例内存地址,该地址保存在e中,如下图:
5)Lookup是一个静态方法,调用时CLR会定位定义该静态方法的类型对应的类型对象,然后JIT编译器在该类型对象的方法表中查找被调用的方法的记录项,对方法进行JIT编译(第一次执行),执行编译后的代码。本例中,假定查出的实例是一个i额Manager类型,则在堆中创建一个Manager实例,用查出的信息初始化该实例,并返回它的地址储存在e中,此时,第一个初始化的Manger对象将没有指针指向它,它成为垃圾回收对象。见下图:
6)GetYearsLookup是一个非虚实例方法,在调用时,JIT编译器会找到发出调用的标量(e)的类型对应的类型对象,本例中为Employee类型对象,因为e被定义为了Employee类型。如果Employee中没有定义该方法,则会继续向上一层查找,知道查找到Object类型对象,查找到该方法后,JIT编译器对其进行编译(第一次执行),再执行变异后的代码,将执行结果保存在局部变量中。见下图:
7)GetProgressReport为定义在Employee中的虚方法,调用一个虚方法,JIT编译器会在方法中生成一些额外代码,这些代码在每次调用方法时都会执行。它首先会检测发出调用的变量,根据地址查找到发出调用的实例,本例为一个Manager对象,然后检测对象内部的类型指针,找到该对象的实际类型,从实际类型对象的方法列表中查找调用的方法的记录项,进行JIT编译(第一次执行),执行变异后代码。见下图:
Q8: 如何理解类型对象?
A8: 类型对象本质上也是对象,它也包含类型对象指针成员,CLR创建这些类型对象时,也会对其进行初始化。CLR开始在一个进程中运行时,会立即为MSCorLib.dll中定义的System.Type对象创建一个特殊的类型对象,Q7中的Emloyee和Manager都是Type类型的“实例”,它们的类型对象指针都会指向Type类型对象,而Type类型对象的类型对象指针则会指向自己。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 支付宝存在安全风险 的文章

 

随机推荐