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++的几个不同之处知识点的更多相关文章

  1. 【AR实验室】mulberryAR : ORBSLAM2+VVSION

    本文转载请注明出处 —— polobymulberry-博客园 0x00 - 前言 mulberryAR是我业余时间弄的一个AR引擎,目前主要支持单目视觉SLAM+3D渲染,并且支持iOS端,但是该引 ...

  2. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  3. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  4. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  5. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  6. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  7. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  8. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  9. SQL Server表分区

    什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...

  10. .Net多线程编程—并发集合

    并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...

随机推荐

  1. 王灏:光音网络致力打造Wi-Fi大生态圈

    光音网络,做的是本地网络综合服务.在中国,想把互联网做到覆盖延伸范围之外的最后100米,光音网络是当中一家,也是最坚持的一家.为千万家本地生活商户提供帮助,为数亿本地用户提供最佳的本地网络体验,这是光 ...

  2. Android中利用OpenMax 编程的基本流程

    近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播 ...

  3. proxy 出现乱码问题解决 lua

    ngx.req.set_header("Accept-encoding", ""); 加上这句 解除乱码 压缩问题造成的乱码

  4. java多线程样例

    这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别: package debug; import java.io.*;import java.lang.Thread; class My ...

  5. android 70 使用ListView把数据显示至屏幕

    使用单元测试添加数据: package com.itheima.showdata; import java.sql.ResultSet; import android.content.Context; ...

  6. ubuntu 14.04 编译安装 nginx

    下载源码包 nginx 地址:http://nginx.org/en/download.html  下载nginx 1.4.7 编译前先安装两个包: 直接编译安装会碰到缺少pcre等问题,这时候只要到 ...

  7. idea集成svn插件

    1.需要在机器上安装一个SVN客户端命令行程序,可以到这里下载对应的安装程序:http://subversion.apache.org/packages.html#windows 我选择的是torto ...

  8. 29、Jquery Ajax

    Ajax Asynchronsous Javascript and XML(异步Javascript和XML). Ajax 是一种无需重新加载整个页面的情况下,更新局部页面的技术. 不是指一种单一的技 ...

  9. 为什么要设置Java环境变量(详解)

    关于java环境变量配置讲解: 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把 jdk安装目录下 ...

  10. error MSB6006: “CL.exe”已退出

    解决方案之一: 删除 \Windows\System32 目录下 mspdb110.dll. 试试吧.