目录
学习目标:
学习内容:
学习时间:
学习产出:
C#接口
C#命名空间
C#预处理指令
C#正则表达式:
C#异常处理
总结:
- 接口定义了所有类继承接口时应遵循的语法。接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的实现是派生类的责任。
- 继承接口的类必须实现接口的所有成员。如果一个接口继承其他接口,那么实现类或结构就也需要实现所有接口的成员。
- 一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。
- 接口中的成员不允许使用 public、private、protected、internal 访问修饰符。接口中的成员不允许使用 static、virtual、abstract、sealed 修饰符。在接口中不能定义字段。在接口中定义的方法不能包含方法体。
- 接口名称必须从大写的I开头。
- 定义,实现(继承),调用(创建对象)。
//定义接口
interface IMyInterface
{
// 接口成员方法
void MethodToImplement();
}
//实现接口
class InterfaceImplementer : IMyInterface
{
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
//调用接口
class Program
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
}
}
接口继承接口:
//定义接口
interface IParentInterface
{
void ParentInterfaceMethod();
}
//定义一个继承的接口
interface IMyInterfacet : IParentInterface
{
void MethodToImplement();
}
//实现接口成员方法,两个接口都需要实现
class InterfaceImplementer : IMyInterfacet
{
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
public void ParentInterfaceMethod()
{
Console.WriteLine("ParentInterfaceMethod() called.");
}
}
//调用接口
class Program
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.ParentInterfaceMethod();
iImp.MethodToImplement();
}
}
菜鸟笔记里面有个人写的很详细C#接口 | 菜鸟
接口(interface)和抽象类(abstract class)的区别
- 接口支持多继承,抽象类不能实现多继承。
- 接口只能定义抽象规则,抽象类既可以定义规则,还可能提供已实现的成员(构造方法)。
- 接口是一组行为规范,抽象类是一个不完全的类,着重族的概念。
- 接口可以用于支持回调,抽象类不能实现回调,因为继承不支持。
- 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义字段、属性、包含有实现的方法。
- 接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。
命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。
namespace firstspace
{
class NamespaceCl
{
public void Func()
{
Console.WriteLine("Inside firstspace");
}
}
}
namespace secondspace
{
class NamespaceCl
{
public void Func()
{
Console.WriteLine("Inside secondspace");
}
}
}
class TestClass
{
static void Main(string[] args)
{
firstspace.NamespaceCl fc = new firstspace.NamespaceCl();
secondspace.NamespaceCl sc = new secondspace.NamespaceCl();
fc.func();
sc.func();
Console.ReadKey();
}
}
//嵌套命名空间
namespace namespace_name1
{
// 代码声明
namespace namespace_name2
{
// 代码声明
}
}
//使用"."访问命名空间的成员
using关键字
System.Console.WriteLine("Hello there");
//或者使用using关键字
using System;
Console.WriteLine("Hello there");
//using的用法:
//1. using指令:引入命名空间
using System;
using Namespace1.SubNameSpace;
//2. using static 指令:指定无需指定类型名称即可访问其静态成员的类型
using static System.Math;var = PI; // 直接使用System.Math.PI
//3. 起别名
using Project = PC.MyCompany.Project;
//4. using语句:将实例与代码绑定
using (Font font3 = new Font("Arial", 10.0f),
font4 = new Font("Arial", 10.0f))
{
// Use font3 and font4.
}
预处理器指令指导编译器在实际编译开始之前对信息进行预处理。
#define | 它用于定义一系列成为符号的字符。 |
---|---|
#undef | 它用于取消定义符号。 |
#if | 它用于测试符号是否为真。 |
#else | 它用于创建复合条件指令,与 #if 一起使用。 |
#elif | 它用于创建复合条件指令。 |
#endif | 指定一个条件指令的结束。 |
#line | 它可以让您修改编译器的行数以及(可选地)输出错误和警告的文件名。 |
#error | 它允许从代码的指定位置生成一个错误。 |
#warning | 它允许从代码的指定位置生成一级警告。 |
#region | 它可以让您在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块。 |
#endregion | 它标识着 #region 块的结束。 |
C# 预处理器指令 | 菜鸟教程 看笔记,写的很详细
关于define和undef,我自己的vs里面是没有的,不知道是不是版本的问题。强行使用会爆红,没啥用。error按照它上面的写了,也爆红。
#if DEBUG
Console.WriteLine("debug模式");
#endif
下面列出了用于定义正则表达式的各种类别的字符、运算符和结构。
Try :用于检查发生的异常,并帮助发送任何可能的异常。
Catch: 以控制权更大的方式处理错误,可以有多个catch子句。
Finally:无论是否发生引发了异常,finally的代码块都将被执行。
try
{
// 引起异常的语句
}
catch( ExceptionName e1 )
{
// 错误处理代码
}
catch( ExceptionName eN )
{
// 错误处理代码
}
finally
{
// 要执行的语句
}
System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类。
System.SystemException 类是所有预定义的系统异常的基类。
异常类 | 描述 |
---|---|
System.IO.IOException | 处理 I/O 错误。 |
System.IndexOutOfRangeException | 处理当方法指向超出范围的数组索引时生成的错误。 |
System.ArrayTypeMismatchException | 处理当数组类型不匹配时生成的错误。 |
System.NullReferenceException | 处理当依从一个空对象时生成的错误。 |
System.DivideByZeroException | 处理当除以零时生成的错误。 |
System.InvalidCastException | 处理在类型转换期间生成的错误。 |
System.OutOfMemoryException | 处理空闲内存不足生成的错误。 |
System.StackOverflowException | 处理栈溢出生成的错误。 |
class DivNumbers
{
int result;
public DivNumbers()
{
result = 0;
}
public void division(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Exception caught: {0}", e);
}
finally
{
Console.WriteLine("Result: {0}", result);
}
}
class Program{
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
创建用户自定义异常
//继承自ApplicationException异常
public class TempIsZeroException : ApplicationException
{
//构造函数
public TempIsZeroException(string message) : base(message)
{
}
}
//自定义异常
public class Temperature
{
int temperature = 0;
public void showTemp()
{
if (temperature == 0)
{
throw (new TempIsZeroException("zero temperature found"));
}
else
{
Console.WriteLine("temperature:{0}", temperature);
}
}
}
class Program
{
static void Main(string[] args)
{
Temperature temp = new Temperature();
try
{
temp.showTemp();
}
catch (TempIsZeroException e)
{
Console.WriteLine("TempIsZeroException:{0}", e.Message);
}
finally
{
Console.WriteLine("这里是Finally");
}
}
}
抛出对象
如果异常是直接或间接派生自 System.Exception 类,您可以抛出一个对象。您可以在 catch 块中使用 throw 语句来抛出当前的对象
Catch(Exception e)
{
...
Throw e
}
1.接口,命名空间,预处理指令,正则表达式
2.正则表达式还没学透,待继续学习