您的位置:首页 > 编程语言 > C#

【C#】C#基础学习笔记

2016-05-28 18:48 519 查看

【C#】C#基础学习笔记

由于之前用过几年C/C++,现只针对C#的差异或C/C++遗忘的知识点学习总结。

1、数据类型:

值类型:和C/C++类似。

指针类型:和C/C++类似。

引用类型:

对象(Object)类型:是所有数据类型的终极基类。Object是System.Object类的别名。当一个值类型转换为对象类型时,则被称为装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。

动态(Dynamic)类型:可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。

动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。

字符串(String)类型:给变量分配任何字符串值。字符串(String)类型是System.String类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

String str = "w3cschool.cc";

@"w3cschool.cc";

C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:

string str = @"C:\Windows";

等价于:

string str = "C:\\Windows";

2、定义常量:

C#不支持宏定义,只支持编译开关。所以不能通过#define PI 3.14的方式来定义常量(C/C++可以)

const double pi = 3.14159; // 局部常量

public static const double pi = 3.14159; // 全局常量

3、杂项运算符:

sizeof()返回数据类型的大小。

typeof()返回class的类型。typeof(StreamReader)。

&返回变量的地址。&a将得到变量的实际地址。

*变量的指针。*a将指向一个变量。 

? :条件表达式 如果条件为真 ? 则为 X : 否则为 Y 

is判断对象是否为某一类型。If( Ford is Car) // 检查 Ford 是否是 Car 类的一个对象。

as强制转换,即使转换失败也不会抛出异常。

Object obj = new StringReader("Hello");

StringReader r = obj as StringReader;

4、对象的封装和访问修饰符:

public:允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。

private:允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。

protected:允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。

Internal:允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。同一个项目中可访问,不同项目中不可以访问。

5、方法调用的参数传递:

值参数:这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。

引用参数:这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。使用ref关键字:n.swap(ref a, ref b);

输出参数:相比于return只能返回一个值,输出参数可以返回多个值。使用out关键字:n.getValues(out a, out b);

6、可空类型和null合并运算符:

nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个null值。

int? num1 = null; //定义可空int类型变量num1,值为null

double? num3 = new double?(); //定义可空double类型变量num3,值为null(new double?()值为null)

null合并运算符:如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。

double? num1 = null;

double num2;

num2 = num1 ?? 5.34; //值为5.34

7、使用foreach循环遍历数组:

int []  n = new int[10]; /* n 是一个带有 10 个整数的数组 */

foreach (int j in n )

{

    Console.WriteLine("{0}", j);//打印数组元素

}

8、类的静态成员和静态函数:

静态成员:static关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。

静态函数:成员函数声明为static。这样的函数只能访问静态变量。静态函数在对象被创建之前就已经存在。

9、继承:C#不支持多重继承。但是可以使用接口来实现多重继承。

class Shape{}

public interface PaintCost{}

class Rectangle : Shape, PaintCost{}//实现多重继承,一个类,一个接口。

10、多态性:

多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。

静态多态性:函数重载,运算符重载。函数的响应是在编译时发生的。

函数重载:根据函数参数类型,参数个数来调用不同的实现方法。

运算符重载:关键字operator后跟运算符的符号来定义

public static Box operator+ (Box b, Box c){}//定义Box的加法运算。使用的时候 Box1 + Box2 既可以实现我们自己实现的方法。

动态多态性:抽象类(abstract ),虚方法(virtual )。函数的响应是在运行时发生的。

密封类:关键字sealed。当一个类被声明为sealed时,它不能被继承。抽象类不能被声明为sealed。

抽象类:用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。不能创建一个抽象类的实例。不能在一个抽象类外部声明一个抽象方法。不能被声明为密封类。

虚方法:虚方法可以在不同的继承类中有不同的实现。派生类中使用override关键字来申明实现虚方法。

11、接口:

关键字interface。接口声明默认是public的。接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

public interface ITransactions{}//定义接口

12、命名空间:

设计目的是为了提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。

定义:namespace namespace_name{}

使用:using System;//在程序开头申明使用系统提供的System命名空间。之后直接可以调用System命名空间中的类和方法,否则需要在前面显示加上System.来使用。

嵌套命名空间定义:

namespace namespace_name1 

{

   // 代码声明

   namespace namespace_name2 

   {

     // 代码声明

   }

}

嵌套命名空间使用:

using first_space;

using first_space.second_space;

13、C#支持正则表达式。

using System.Text.RegularExpressions;

Regex类里面包含所有的正则表达的方法实现。

14、异常处理:

关键字:try、catch、finally、throw

try:一个try块标识了一个将被激活的特定的异常的代码块。后跟一个或多个catch块。

catch:程序通过异常处理程序捕获异常。catch关键字表示异常的捕获。

finally:finally块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。

throw:当问题出现时,程序抛出一个异常。使用throw关键字来完成。

用户自定义异常:用户自定义的异常类是派生自ApplicationException类

定义:

public class TempIsZeroException: ApplicationException

{

   public TempIsZeroException(string message): base(message)

   {

   }

}

抛出:throw (new TempIsZeroException("Zero Temperature found"));

15、文件IO:

using System.IO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#