C#与C++的几个不同之处知识点
1.索引器
索引器是C#自创的内容,这是C++当中没有的内容,所以做一次笔记.
索引器是用于书写一个可以通过使用[]想数组一样直接访问集合元素的方法。我们只需要指定待访问实例或元素的索引。索引器的语法和类属性语法相同,除了接受作为元素索引的输入参数外。
- class SampleCollection<T>
- {
- // 声明一个数组来存储数据元素。
- private T[] arr = new T[];
- // 定义索引器,它允许客户机代码
- / /类实例上使用[]符号本身。
- / /下面的代码主要(参见第2行。)
- public T this[int i]
- {
- get
- {
- //这个索引器非常简单,仅仅返回或设置
- //数组从内部相应的元素。
- return arr[i];
- }
- set
- {
- arr[i] = value;
- }
- }
- }
- //program类显示了客户端代码使用索引器。
- class Program
- {
- static void Main(string[] args)
- {
- // 声明SampleCollection类型的一个实例。
- SampleCollection<string> stringCollection = new SampleCollection<string>();
- // 使用[]符号的类型。
- stringCollection[] = "Hello, World";
- System.Console.WriteLine(stringCollection[]);
- }
- }
2.拆箱与装箱
装箱:所谓装箱是将一个原始类型或基础类型对象赋给一个object对象,object是C#基类,所有类都继承自object类
拆箱:反之,拆箱是将一个事先装箱过的object对象强制转换为目标对象。
例如:
- class Test
- {
- static void Main()
- {
- int mInt;
- object obj=mInt;//装箱
- int myInt=(int) obj;//拆箱
- }
- }
3.参数的按值传递与按引用传递
在C#当中,按值传递与C++是一样的,这里不做介绍了;主要说一下按引用传递。
C#使用关键字ref指定引用参数,在形参中使用ref的同时,在实参中也要用ref,否则将出现编译错误,另外你不能将一个没用初始化的对象按引用传递给函数。
例如:
- class TestRef
- {
- int a=;
- myMethod(ref a);//use func by ref
- .........
- void myMethod(ref int a)
- {
- //function block
- }
- }
4.输出参数
输出参数只是从函数返回值的参数,输入值不要求。C#使用关键词out表示输出参数。
例如:
- class TestOut
- {
- int val;
- getNodeValue(val);
- ..........
- bool getNodeValue(out int val)
- {
- val = value;
- return true;
- }
5.可变数量的参数和数组
C#中的数组使用关键词param进行传递,一个数组类型的参数必须总是函数最右边的参数.可以传递任意数量的的元素作为数组类型的参数。
例如:
- class TestArray
- {
- void func(param int []array)
- {
- print(array.length);
- }
- func();//输出1
- func();//输出0
- func(,,);//输出3
- func(new int[]array {,,,,});//输出5
- int []array2=new int[]{,,,,,};
- func(array2);//输出6
- }
6.运算符与表达式
is关键字:
is关键字的作用是检查目标对象与给定对象是否兼容;如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。
例如:
- class test1{}
- class test2{}
- class test3: test2{}
- class isTest
- {
- test1 t1;
- test2 t2;
- static void Test(object obj)
- {
- if(obj is t1)
- {
- print("obj is test1 classes");
- t1 = (test1)obj;
- }
- else if(obj is t2)
- {
- print("obj is test2 classes);
- t2 = (test2)obj;
- }
- else
- {
- print("obj not is test1 and test2");
- }
- }
- static void Main()
- {
- test1 T1=new test1();
- test2 T2 = new test2();
- test3 T3 = new test3();
- test(T1);
- test(T2);
- test(T3);
- test("my test content");
- }
- }
as关键字:
as关键字类似于C++强制类型转换,但是如果强制转换不成功,as将返回null而不引发异常。
例如:
- namespace MyFirstApp
- {
- class Base
- {
- public override string ToString()
- {
- return "base";
- }
- }
- class Device : Base
- {
- public delegate void GetVisiter(string name);
- }
- class Program
- {
- static int Main()
- {
- Device de = new Device();
- Base b = de as Base;
- if(de != null)
- {
- System.Console.WriteLine(de.ToString());
- }
- return ;
- }
- }
- }
表达式:
- expression as type
和下面的代码是一样的效果,说明as关键字是通过is来实现的
- expression is type ? (type)expression : (type)null
sealed 关键词
被sealed修饰的类不能被实例化
7.接口类interface
在C#当中不引许多继承,多继承应该考虑把基类声明为interface,并且在interface声明封装的类中,不引许函数的实现,只能写出声明,就像C++的头文件,函数的实现留给派生类或结构去实现。
例如:
- //interface
- interface Equatable<T>
- {
- bool Equals(T obj);//只能写出函数声明
- }
- //
- public class TestEquals : Equatable<TestEquatable>
- {
- public string Make { get; set; }
- public string Module { get; set; }
- public string Year { get; set; }
- public bool Equals(TestEquals te)//实现基类当中的Equals函数
- {
- if(this.Make==te.Make &&
- this.Module==te.Module &&
- this.Year==te.Year)
- {
- return true;
- }
- else
- {
- return flase
- }
- }
注意:
接口具有下列属性:
接口与抽象基类。 实现接口的任何类或结构必须实现其所有成员的链接。
接口不能直接实例化。 其成员通过实现接口的任何类或结构实现。
接口可以包含事件、索引器、方法和属性。
接口不包含方法的实现。
类或结构可以实现多个接口。 类可以继承基类并实现一个或多个接口
C#与C++的几个不同之处知识点的更多相关文章
- 【AR实验室】mulberryAR : ORBSLAM2+VVSION
本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- 试试SQLSERVER2014的内存优化表
试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 关于.NET异常处理的思考
年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server表分区
什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
随机推荐
- ios7新特性实践
一 iOS 7 新特性:视图控制器切换API 二 iOS 7系列译文:认识 TextKit 三 iOS 7系列译文:iOS7的多任务处理 四 iOS7 最佳实践:一个天气应用案例(上) 五 iOS7 ...
- CoreJava_线程并发(堵塞队列):在某个目录下搜索含有某keyword的文件
Java多线程编程是很考验一个程序猿水平的. 传统的WEB程序中.由于框架提供了太多的健壮性.并发性.可靠性的支持,所以我们都是将全部的注意力放到了业务实现上.我们不过依照业务逻辑的要求.不停的积累自 ...
- Linux发送监控指标到内部邮箱
数据库的健康监控是个很重要的工作.重要的指标\KPI监控结果会有专门的採集.监控.告警系统来做相关事情. 而一些不是很重要的或者还在设计和调试阶段的相关指标,我仅仅是想发送到我自己邮箱,本文就针对在s ...
- 深入理解Fsync----JBD内核调试 专业打杂程序员 @github yy哥
http://hustcat.github.io/ http://www.cnblogs.com/hustcat/p/3283955.html http://blog.sina.com.cn/s/ar ...
- Qemu下安装Sun Solairs8简明教程 转
http://blog.csdn.net/stonesharp/article/details/8928393 Qemu下安装Sun Solairs8简明教程(Centos6. / Win7) 作者: ...
- hadoop错误Could not obtain block blk_XXX_YYY from any node:java.io.IOException:No live nodes contain current block
错误: 10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYY ...
- HDU2084JAVA
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- oracle数据库敏感操作前创建还原点
我们都知道,在vmware虚拟机中有一个拍摄快照的功能,我们可以把系统此时的状态保存下来,一方后面遇到不测事件,也好将系统还原,oracle中也有类似功能. 首先创建一张学生表: 向学生表中插入一条数 ...
- Angular2 - Starter - Component and Component Lifecircle Hooks
我们通过一个NgModule来启动一个ng app,NgModule通过bootstrap配置来指定应用的入口组件. @NgModule({ bootstrap: [ AppComponent ], ...
- 【php】中【event】之实现方式
这两天看了点事件机制,那么在php中,如何实现最简单的事件呢? 废话不多说,我们上代码. <?php class Event{ //事件名称 public $name; //存储hander p ...