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名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
随机推荐
- C# richTextBox编辑器
附件:http://files.cnblogs.com/xe2011/CSHARP_RichTextBoxEditor.rar 完整的转到这里 http://www.cnblogs.com/xe201 ...
- soap实例入门(转)
SOAP的HelloWord实例- - 1.1 前言 2005-3-2公司开会并分给我一个任务:写一个程序从福建移动的BOSS系统取出一些相关数据.我得到的资料仅仅有一个“福建移动BOSS与业务增值 ...
- careercup-链表 2.5
2.5 给定两个用链表表示的整数,每个结点包含一个数位.这些数位是反向存放的,也就是个位排在链表首部.编写函数对这两个整数求和,并用链表形式返回结果. 示例: 输入: (7->1->6)+ ...
- java 中能否使用 动态加载的类(Class.forName) 来做类型转换?
今天同事提出了一个问题: 将对象a 转化为类型b,b 的classpath 是在配置文件中配置的,需要在运行中使用Class.forName 动态load进来,因为之前从来没有想过类似的问题,所以懵掉 ...
- sqlite数据库修改及升级
今天是上班的第二天,听说我最近的任务就是改bug,唉,权当学习了,遇到的一些问题都记录下来. sqlite数据库是android中非常常用的数据库,今天帮别人改bug,遇到一些问题记录下来. 1.修改 ...
- Android开发全套视频教程在线观看网盘下载
千锋金牌讲师老罗老师简介: 国内第一批Android教学讲师,10多年软件开发经验,6年多教学经验,曾担任广东电信北京分公司移动事业部项目经理,主持过微软中国平台考试系统.山西省旅游局智能化平台等大型 ...
- Java实现微信菜单json字符串拼接
Java实现微信菜单json字符串拼接 微信菜单拼接json字符串方法 >>>>>>>>>>>>>>>> ...
- samba环境搭建
1.安装samba软件 sudo apt-get install samba cifs-utils samba-common 2.创建与windows共享目录 mkdir share chmod 77 ...
- javascript:console.log()是什么js库里的?
这个不是什么库的,这个是浏览器的函数,如果你使用firefox并且装有firebug插件,当使用console.log(……)时,会把括号内的字符串输出到控制台,当然,在IE中这个是没有的,要报错.相 ...
- clipboard让复制的文本换行
https://clipboardjs.com/dist/clipboard.min.js 用clipboard实现复制时, 想让复制的文本换行, 有两咱方法: 第一种, HTML实现: <!- ...