复习.net/c#时的小文章之万年草稿版 (全是基础概念,请懂的人绕行)

必读文:
61条面向对象设计的经验原则(体会篇)

C#知识点集合 (面试必备)



一、显式(explicit)转换和隐式(implicit)转换的一般概念
int i = 100;
Response.Write(i); // 这就是隐式
Response.Write(i.ToString()); // 这就是显式
一般来讲,尽量使用显式转换,隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。但是,因为可以在程序员未指定的情况下发生隐式转换,因此必须注意防止令人不愉快的后果。
另外还有,基类与派生类,接口与类,接口与子接口等的显隐式转换。基本都建议为显式。
有时间的话,查看下“泛型”

二、理解C#值类型与引用类型
http://blog.csdn.net/begtostudy/archive/2008/08/22/2816320.aspx

值类型:结构/枚举/数值/可空类型(System.Nulable<T>泛型结构体) - (reference.GetType().IsValueType = true)
引用类型:数组/用户定义的(类/接口/委托)/object(装箱)/string - (reference.GetType().IsValueType = false)

注意:
结构体可以实现接口(?)
引用类型可以派生成别的,可是值类型不行
引用类型的复制只复制对象的引用而非对象本身(参考堆栈),而值类型的复制是整个复制(也参考堆栈)
引用类型需要new 来创建实例(new 操作符暗示一个类实例的创建,但不一定必须暗示动态内存分配,这和C++中对指针的操作不同。)
不管string看起来多么象值类型,它实际上是引用类型(它在被重新赋值时,托管堆会重新给它的变量分配内存)
值类型(比如结构体)不要求托管堆在栈上分配内存,那么它们被存放(部署)在哪? 
      值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。
类里面有值类型,结构体里面有引用类型,这种嵌套好复杂,文章里面有讲,暂时不想理会
反复的创建引用类型的实例,一定会损失性能,这个显尔易见
我们到底是要创建类还是结构呢?
  是否用于数据存储?是否完全由一些数据成员存取呢?是否永远不会有子类?是否永远不会有多态?如果都是的话,那无疑应该选择结构体而非类。
尽可能的确保0为值类型的有效状态,不然出现Null而导致编译出错,oracle也同样适用,nvl(a,0)+nvl(b,0)而非a+b,容易产生Null值而出错。
尽量减少装箱及拆箱操作。耗费性能而且会引发奇怪的bug。

三、泛型
MSDN中文详解:http://msdn.microsoft.com/zh-cn/library/512aeb7t(VS.80).aspx
通过使用泛型类型参数T,可以编写单个类,而不致引入运行时强制转换或装箱操作的成本或风险。
      泛型可以重用代码、保护类型的安全、提高性能
      泛型最常用于创建集合类 (如:BookCollection<T>)
      泛型对应的非泛型为ArrayList,使用的命名空间为System.Collections.Generic
      泛型有:接口/类/委托/事件;同样可以被反射查到
      可以约束某些数据类型访问该泛型
结构/类/new()/<某基类名>/<接口名称>/U(裸类型约束)
我看到where T: 上述几种,这个是判断T是否属于某(几)种特定的数据类型的意思吗?
      裸类型约束:用作约束的泛型类型参数称为裸类型约束。当具有自己的类型参数的成员函数需要将该参数约束为包含类型的类型参数时
Kill me!真得用到的时候才能真正明白,暂时放下吧。具体的应用现在抱着文件看也没用,用到的时候再看吧,反正一般公司的类库都很完整ZZzz,至少需要用到的时候知道有这个东西多个方法。  

四、抽象类/接口 以及 抽象方法/虚方法 、 sealed

抽象类以及接口:
      抽象类:>>  public abstract classA{}
      列举一个类所用到的行为,但不明确的实现每个行为,抽象类可以有自己已经实现过的方法;
      不能被实例化,只能被继承;
      它的派生类可以override其抽象方法,但不是必须的,但一旦派生类没有实现所有的抽象方法,那它也将同样视作抽象类。
      所以,如果一个类要能被实例化(new),则必须实现其基类全部的抽象方法。
      
      接口:>> public Interface IClassA{}
      接口说白了,就是一个类的模型,里面啥都有,可啥也不给你实现,反正就是画了个模子,要用到就要一个一个的全部填满了才行,是全部实现喔,只实现一部分都是不行的。
      比如,定义类,[返回值] [类名](参数); 再比如属性吧。[属性名]{get;set;} 再比如事件event [事件类] [事件名]; 

      到底我现在是要一个抽象类呢?还是一个接口呢?有什么不同呢?
      1、一个类,只能继承到一个抽象类,但可以实现多个接口;public class ANewBie:AbstractA, IInterfaceA, IInterfaceB;
      2、抽象类里面可以有已经实现过的方法,直接继承了就是,可是接口是模子,要用到里面的就用就是了
      3、所以,一般都用抽象类,尤其是大型的项目中。而接口一旦被使用就很难去更改,所以基本只是使用到这个接口的类之间的通迅而已,让这些类保持一定的联系和相关性。反正一个类可以实现多个接口,一个接口少定义一点东西,基本都是一些小的功能性模块,这样用起来也是不错的。比如,我要定义一些形状,那就可以把长宽等作为属性给归在一个接口里面,用的时候,这些形状都被这个接口联系在一起了。

 

抽象方法(abstract)与虚方法(virtual):

      虚方法和抽象方法主要都是体现了多态性,在覆盖重写重用上的不同。
      1、一个类里有一个抽象方法就必须被定义成抽象类,反之,一个抽象类里面可以有非抽象方法。不可以实例化成对象,只能被继承。
      2、抽象方法一定要被其派生类override,抽象方法一定要被重写,而虚方法可以被重写。(抽象方法 = 未实现的虚方法)
      3、虚方法可以在基类中实现,但抽象方法却不可以。静态成员、构造以及析构方法不能为虚。
      当你觉得一个方法要实现什么功能,并且知道怎么实现功能的时候,用虚方法; 当你知道方法要实现的功能,但对怎么实现不清楚的时候,用abstract。

以下摘自C#知识点一文:
如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.
如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以 new方式,即忽略派生类中的方法的方式来运行

ContractedBlock.gifExpandedBlockStart.gif实例
// Versioning\versioning.cs
001public class MyBase
002: {
003:     public virtual string Meth1()
004:     {
005:         return "MyBase-Meth1";
006:     }
007:     public virtual string Meth2()
008:     {
009:         return "MyBase-Meth2";
010:     }
011:     public virtual string Meth3()
012:     {
013:         return "MyBase-Meth3";
014:     }
015: }
016:
017class MyDerived : MyBase
018: {
019:     public override string Meth1() // 覆盖
020:     {
021:         return "MyDerived-Meth1";
022:     }
023:     public new string Meth2() // 用new来忽略
024:     {
025:         return "MyDerived-Meth2";
026:     }
027:     public string Meth3() // 系统在这里将会有一个警告,并且将会隐藏方法Meth3()
028:                          
029:                          
030:     {
031:         return "MyDerived-Meth3";
032:     }
033:
034:     public static void Main()
035:     {
036:         MyDerived mD = new MyDerived();
037:         MyBase mB = (MyBase) mD;
038:
039:         System.Console.WriteLine(mB.Meth1());
040:         System.Console.WriteLine(mB.Meth2());
041:         System.Console.WriteLine(mB.Meth3());
042:     }
043: }
输出:
MyDerived
-Meth1
MyBase
-Meth2
MyBase
-Meth3


 如果你把第037行去掉,把039-041中的mB全部改为mD,输出又变为:
MyDerived-Meth1
MyDerived-Meth2
MyDerived-Meth3
这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效.呵呵,这样说的确有点难以理解,大家只有自己动手,才能搞清楚这其中的机关,所谓"实践是检验C#的唯一标准",哈哈!

 

五、其它
静态构造方法:无需定义访问修饰符因为没有意义,构造函数不能带参数,一个类只可以有一个静态的构造方法。
readonly / const / static:
      const和static的赋值,不能在构造方法中设置
      readonly的赋值只能在构造方法中(虽然不须,有默认值)
      都不能作为变量或者out参数传递给方法,但可以传递给构造方法。
      const常量是隐式静态,但不可以加上static修饰符。

 

六、一些关键字:

      1、sealed
            密封,可以用在类/方法/属性等前面,意指“不可以被其它的类继承或者重写”,所以显然,密封类不可以同时是抽象类或者用来修饰接口。
            所以,sealed类中的属性和方法,可以是public类型或private类型,但不可以是protected类型。
      2、override
            覆盖重写,重载方法的签名必须不同 - 即参数的名称、个数和类型必须不同,只有返回类型不同是不够的。
      3、partial
            很有趣的概念,就是一个类,可以由多个人去完全其中的各个部分,只要用了partial,那么在编译的时候,会把这些类合并在一起,组成一个类。:)
            http://blog.csdn.net/zabcd117/archive/2008/01/08/2029987.aspx
       4、internal
            内部成员只有在同一程序集(assemble)中的文件内才是可访问的。内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。(web b/s的用得很少这个东东)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

timertask run函数未执行_图执行模式下的 TensorFlow 2

文 / 李锡涵&#xff0c;Google Developers Expert本文节选自《简单粗暴 TensorFlow 2.0》尽管 TensorFlow 2 建议以即时执行模式(Eager Execution)作为主要执行模式&#xff0c;然而&#xff0c;图执行模式(Graph Execution)作为 TensorFlow 2 之前的主要执行模式&#xff0c…

AJAX自学笔记01

从今天开始正式系统学习asp.net ajax了。XMLHttpRequest对象属性&#xff1a;Number readyState (返回值4表示完成)Function onreadystatechange (执行回调函数)string responseText &#xff08;返回字符串型&#xff09;XMLDocument responseXML&#xff08;返回XML型&#x…

如何从 0 到 1 打造团队 PC/H5 构建工具

关注若川视野, 回复"pdf" 领取资料&#xff0c;回复"加群"&#xff0c;可加群长期交流学习一、前言 大家好&#xff0c;我叫鳗鱼&#xff0c;这次分享的主题是如何从 0 到 1 打造适合自己的构建部署方案。image.png先例行的自我介绍&#xff0c;大概 14 年…

PHP yii 框架源码阅读(二) - 整体执行流程分析

转载链接&#xff1a;http://tech.ddvip.com/2013-11/1384432766205970.html 一 程序入口 <?php// change the following paths if necessary $yiidirname(__FILE__)./http://www.cnblogs.com/framework/yii.php; $configdirname(__FILE__)./protected/config/main.php;/…

HTTP状态码大全

完整的 HTTP 1.1规范说明书来自于RFC 2616&#xff0c;你可以在http://www.talentdigger.cn/home/link.php?urld3d3LnJmYy1lZGl0b3Iub3JnLw%3D%3D在线查阅。HTTP 1.1的状态码被标记为新特性&#xff0c;因为许多浏览器只支持 HTTP 1.0。你应只把状态码发送给支持 HTTP 1.1的客…

testng接口自动化测试_Java+Maven+TestNG接口(API)自动化测试教程(10) 使用 Jenkins 构建自动化测试持续集成...

现在代码可以运行了&#xff0c;但是每次运行都需要我们手工去执行&#xff0c;并且测试报告也只能在执行测试的电脑上才能看到&#xff0c;我们希望能够定时自动执行测试&#xff0c;并且能够做到自动发送测试报告到相关人员的电子邮箱中。Jenkins 正好可以很好的完成以上诉求…

sql数据类型详解

BCD码1字符1/2字节 ASC码1字符1字节 GB2312码1字符2字节 BIG5码1字符5字节 (1)二进制数据类型 二进制数据包括 Binary、Varbinary 和 Image  Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。  Binary[(n)] 是 n 位固定的二进制数据。其中&#xff0c;n 的取…

论公众号内卷

关注若川视野, 回复"pdf" 领取资料&#xff0c;回复"加群"&#xff0c;可加群长期交流学习曾几何时公众号文章的标题单纯且没有套路七年前的我就是这样仅仅把公众号当做一个写文章的博客平台甚至是像有道云一样的在线笔记平台当时的标题是这样子滴《hashma…

PHP 利用Mail_MimeDecode类提取邮件信息

转载链接:http://blog.csdn.net/laijingyao881201/article/details/5512693 重点为one_mail函数。利用Mail_mimeDecode类从邮件中提取邮件头和邮件正文。 <?php header("content-type:text/html; charsetUTF-8"); /** record kid words and insert into databa…

【转】概要设计说明书

概要设计说明书 一&#xff0e; 引言 1&#xff0e; 编写目的 从该阶段开发正式进入软件的实际开发阶段&#xff0c;本阶段完成系统的大致设计并明确系统的数据结构与软件结构。在软件设计阶段主要是把一个软件需求转化为软件表示的过程&#xff0c;这种表示只是描绘出软件的…

程序异常异常代码: 0xc0000005_Java基础:看完这篇你还怕碰到异常吗?

前言在日常的开发以及平时的学习练习中&#xff0c;异常相信对于大家来讲并不陌生&#xff0c;但是对于异常的具体使用、底层实现以及分类等等可能并不是很了解。今天我就抽出了一点时间系统的整理了异常的各个知识点&#xff0c;希望能够帮助到大家对于Java 异常的理解与学习。…

写给初中级前端工程师的进阶指南

学习一门新技术的时候&#xff0c;最大的苦恼之一&#xff0c;大概就是不知道从何入手。典型的情况是&#xff0c;你大概知道学会以后&#xff0c;这门技术可以帮你解决什么问题。但是&#xff0c;怎么才能学会、循序渐进的学习路线是什么、学习范围有多大的深度和广度、涉及到…

同一页面中引入多个JS库产生的冲突解决方案(转)

发生JS库冲突的主要原因&#xff1a;与jQuery库一样&#xff0c;许多JS库都使用‘$’符号作为其代号。因此在一个页面中引入多个JS库&#xff0c;并且使用‘$’作为代号时&#xff0c;程序不能识别其代表哪个库&#xff08;这个是我自己的解释&#xff0c;但更深的原因就必须深…

不用安装Oracle Client如何使用PLSQL Developer

1. 下载oracle的客户端程序包&#xff08;30M&#xff09;只需要在Oracle下载一个叫Instant Client Package的软件就可以了&#xff0c;这个软件不需要安装&#xff0c;只要解压就可以用了&#xff0c;很方便&#xff0c;就算重装了系统还是可以用的。下载地址&#xff1a;http…

input file的默认value清空与赋值方法

转载链接&#xff1a;http://www.jb51.net/article/24872.htm出于安全性考虑&#xff0c;JS是不能直接设置File的value值的&#xff0c;下面是我总结出来的方法第1个方法是大多人传统做法&#xff0c;替换HTML代码&#xff0c;楼上的已经用到了&#xff0c;我不过是用正则优化一…

python中o_Python I/O与进程的详细讲解

I/Owith语句with context_expression [as target(s)]:with-bodycontext_expression返回值遵从上下文管理协议&#xff0c;包含__enter__()与__exit__()方法&#xff0c;as语句的target(s)得到的是__enter__()返回值&#xff0c;执行with-body后会调用上下文管理器的__exit__()方…

千层套路 - Vue 3.0 初始化源码探秘

关注若川视野, 回复"pdf" 领取资料&#xff0c;回复"1"&#xff0c;可加群长期交流学习刘崇桢&#xff0c;微医云服务团队前端工程师&#xff0c;左手抱娃、右手持家的非典型码农。9 月初 Vue.js 3.0 正式发布&#xff0c;代号 "One Piece"。大秘…

css网页布局兼容性有哪些要点与诀窍

IE vs FFCSS 兼容要点&#xff1a;DOCTYPE 影响 CSS 处理FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中FF: 设置 padding 后, div 会增加 height 和…

js 下拉底部加载|滑轮滚动到页面底部ajax加载数据的实例

转载链接&#xff1a;http://www.cnblogs.com/thinksley/archive/2013/05/12/3074237.html 滚动下拉到页面底部加载数据是很多瀑布流网站的做法&#xff0c;那来看看配合jsonp是如何实现的吧&#xff0c;小菜总结记录之用&#xff0c;高手勿喷。 当然本例子采用的是jquery库&…