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名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
随机推荐
- 基于Shading Model(对光照变化一定不变性)的运动目标检测算法
光照模型(Shading Model)在很多论文中得到了广泛的应用,如robust and illumination invariant change detection based on linea ...
- UIImage载入图片的几种方式及差别
用UIImage载入图像的方法非常多.最经常使用的是几种: 1.使用imageNamed函数载入: <span style="font-size:14px;">[UI ...
- hadoop错误org.apache.hadoop.mapred.TaskAttemptListenerImpl Progress of TaskAttempt
错误: org.apache.hadoop.mapred.TaskAttemptListenerImpl: Progress of TaskAttempt 原因: 错误很明显,磁盘空间不足,但郁闷的是 ...
- windows7 'telnet'不是内部或外部命令--转载
['telnet'不是内部或外部命令,也不是可运行的程序或批处理文件]当你想用telnet命令时,发现提示这句话怎么办?其实很简单,接下来为大家介绍下如何使用 方法/步骤 一般只有windows7 ...
- Oracle笔记-表的管理
3.1创建和管理表在Oracle表中使用的emp,dept,sal都是系统内建好的表,那么在SQL语法中同样支持了表的创建语句,要想创建表,则应先了解下Oracle中最常用的几种数据类型3.1.1常用 ...
- php之常量小见
php设置常量有二种方法,一为define(),二为使用关键字const. define()函数带有三个形参,一为常量名,通常以大写字母命名,二为值,三为是否对大小写敏感,其值为可选,默认为false ...
- js--小结③
- SQL 建立临时表进行查询
SELECT min (maxrank) as minofmaxrank FROM (SELECT max(rank) as maxrank FROM tbl_core_staff WHERE st_ ...
- 3. NHibernate基础知识 - 你必须知道的一些事情
首先介绍一下框架结构(这个有个概念就可以): 然后我们会介绍一个很重要的概念(一定要好看)!! 这节对 NHibernate 架构做一个介绍,首先要了解一下该框架在应用程序中的位置: 先来一个简单的图 ...
- SQL多表查询中的分页,字段组合综合实例解析
原文:http://www.jb51.net/article/28753.htm http://xuzhihong1987.blog.163.com/blog/static/2673158720098 ...