C# 基础

命名空间下的类型可以为:Class、interface、delegate、struct、enum,不可以直接写变量和方法。

除了一下差异,C#中的变量几乎和C++中一样:

1、C#中的变量,总是需要你在访问前进行初始化,否则编译出错。

2、不能在C#中访问一个“挂起”指针。

3、超出数组边界的表达式索引值同样不可访问。

4、C#中没有全局变量或全局函数,取而代之的是通过静态函数和静态变量完成。

所有C#的类型都是从object类继承的。

bool仅接受真、假而非任意整数。

值类型:

(在堆栈中分配的数据类型)

1、除了字符串的所有基本和内建类型。

2、结构。

3、枚举。

引用类型:

(在堆中分配的数据类型,不再使用时,将自动进行垃圾清理。)

1、类

2、接口

3、集合类型 如数组

4、字符串

枚举类型:

enum Week { Monday, Tuesday, Wednesday};
namespace test
{
    using cs = Console;

    class Program
    {
        static void Main(string[] args)
        {
            Week week = Week.Monday;
            cs.WriteLine(week.ToString());
            cs.WriteLine((int)week);
            cs.WriteLine((Week)1);

            //获取字符串对应的枚举值
            cs.WriteLine((Enum.Parse(typeof(Week), "Wednesday", true)));//第三个参数表示是否忽略大小写
        }
    }
}

类与结构:

1、类的对象在堆中分配,并使用关键字new创建。而结构在栈中进行分配。

readonly:

1、readonly仅用于修饰类的数据成员,改成员有了值后将不可再做修改,和const数据成员不同之处在于const要求声明时就初始化。

sealed:

1、sealed修饰的类不允许你从它继承任何类。sealed class name{}

unsafe:

1、你可以使用unsafe修饰符在C#中定义一个不安全上下文。在不安全上下文中,你可以插入不安全代码,如C++的指针等。

public unsafe MyFun(int *pInt, double* pDou)

{

  int* p = new int;...

函数的参数

输出参数:必须在方法的声明和调用中都使用out修饰符。

1.在方法内部,输出参数在被读取之前必须被赋值。这意味着参数的初始化是无关的,而且没有必要在方法调用前为其赋值。

2.每个输出参数在方法返回前必须被赋值。

引用参数:必须在方法的声明和调用中都使用ref修饰符。

实参必须是变量,在用作实参前必须被赋值。如果是引用类型变量,可以赋值为一个引用或NULL值。

参数数组:必须在方法的声明中使用params修饰符。

1.在一个参数列表中只能有一个参数数组。

2.参数数组必须是列表中的最后一个

声明参数数组:a.在数据类型前使用params修饰符。

                 b.在数据类型后放置一组空的方括号。

                     eg: void ListInts(params int[] inVals)

函数的重载

● 两个方法不能仅在返回类型上有区别。
● 两个方法不能仅根据参数是声明为ref还是out来区分。

栈帧

当一个方法被调用时,在栈顶分配了一块内存用于保存一定数量与方法相关的数据项,这块内存叫方法的栈帧。

栈帧保存的内容:

    1.返回地址--方法退出时在哪儿继续执行。

    2.分配内存的参数--就是方法的值参数

    3.与方法调用相关的其他各种管理数据项。

方法被调用时,整个栈帧被压入栈中。

方法退出时,它的整个栈帧被从栈中弹出。弹出一个栈帧有时也称为释放栈。

接口:

1、接口是只包含函数签名而在子类中实现的抽象基类。子类可实现多重接口(C#不允许对类进行多重继承,由此可实现多重继承)

索引器:

1、参数化成员属性:包含set、get方法。

2、与成员属性不同:它可以接受1个或多个参数;使用this作为索引器的名字。

3、语法:[访问修饰符] 数据类型 this[数据类型 标识符]

4、索引器用于书写一个可以通过使用[]像数组一样直接访问集合元素的方法。CollectionBase是用于创建集合的类库。List是CollectionBase中用于存放集合列表的受保护成员。

class Shape:CollectionBase

{

    public void add(Shape sp)

    {

       List.Add(sp);

    }

    public Shape this[int idx]

    {

       get

       {

           return (Shape)List[idx];

       }

       set

       {

           List[idx] = value;

       }

    }

}

装箱、拆箱

  装箱的思想在C#中是创新的。正如前面提到的,所有的数据类型,无论是内建的还是用户定义的,都是从System命名空间的基类object继承的。所以基础的或是原始的类型打包为一个对象称为装箱,相反的处理称为拆箱。

运算符

is运算符:用于检查对象是否是给定类型,或是否可以转换成给定类型,返回布尔值。if(val is ClassA)...

as运算符:功能如is,但返回null或已经转换的对象。

语句

foreach: 用于迭代数组等集合

lock: 在线程中使代码块称为重点部分。lock关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放改锁。

checked/unchecked:用于数字操作中的溢出检查。

Switch:执行一条case语句后,程序流不能跳转到下一个case语句。 

委托(delegate):

让我们可以把函数引用保存在变量中。这就好比C++使用typedef保存函数指针一样。

虚函数:

需要使用ovverride关键字在子类中实现虚函数。

使用new隐藏父类函数

常用命名空间:

System.Drawing     处理图形和绘图,

System.Data        处理数据存储和管理,在定义ADO.NET技术中扮演重要                     角色

System.IO          管理对文件和流的同步和异步访问

System.Windows     处理基于窗体的窗口的创建

System.Reflection  包含从程序集读取元数据的类

System.Threading   包含用于多线程编程的类

System.Collections 包含定义各种对象集的接口和类

重载运算符

可重载运算符:

1.一元运算符:+, -, !, ~, ++,--,   true, false

2.二元运算符:+, -,*,/,%,|,^,<<,>>

3.比较运算符:==,!=,<,>,<=,>=

如果重载了true和false运算符,就可以在布尔表达式中使用类,例如,if(opl){}。

原文地址:https://www.cnblogs.com/wrbxdj/p/5857729.html