Day11

一、c#中的面向对象编程

1、class

二、Recursion——递归

递归的总结:

1)通过自己调用自己吧复杂的逻辑简单化,可以求得最终结果;

2)递归要有开始条件,也要有一个结束条件;

3)有一种递归的逻辑运算。

三、继承

1、 继承构造函数的调用序列

 1 class Animal
 2 {
 3  public Animal()
 4  {
 5  Console.WriteLine("In Animal's constructor");
 6  }
 7 }
 8 class Dog : Animal
 9 {
10  public Dog()
11  {
12  Console.WriteLine("In Dog's constructor");
13  }
14 }

 2、Inheriting from a base class——从基类中继承

通常继承父类,父类是公共代表的方法。例如下:

 1 public class Animal
 2 {
 3  public string Name { get; set; }
 4  // 所有动物共有的方法和属性
 5  public void Eat(Object dinner)
 6  {
 7  // ...
 8  }
 9  public void Stare()
10  {
11  // ...
12  }
13  public void Roll()
14  {
15  // ...
16  }
17 }

写一个cat子类继承animal

public class Cat : Animal
{
 public Cat()
 {
 Name = "Cat";
 }
 // 划伤家具和忽略主人公共空隙划伤的方法
 public void Scratch(Object furniture)
 {
 // ...
 }
}

四、Generics——泛型

1、以下称呼是等价的

M<object>(new object());
M(new object());

M<string>("");
M("");

M<object>("");
M((object) "");
M("" as object);

2、Type inference (classes)

注意参数的类型。

1 class Tuple<T1,T2>
2 {
3  public Tuple(T1 value1, T2 value2)
4  {
5  }
6 }
7 
8 var y = new Tuple<int, string>(2, "two");

或者写一个静态方法:

1 static class Tuple
2 {
3  public static Tuple<T1, T2> Create<T1, T2>(T1 value1, T2 value2)
4  {
5  return new Tuple<T1, T2>(value1, value2);
6  }
7 }
8 var x = Tuple.Create(2, "two");

3、类型约束

不太懂

4、Type Parameters (Interfaces)——类型参数接口

(代码里面有,依赖注入那个地方,不加就会报错)

声明:

interface IMyGenericInterface<T1, T2, T3, ...> { ... }

使用(继承):

class ClassA<T1, T2, T3> : IMyGenericInterface<T1, T2, T3> { ... }
class ClassB<T1, T2> : IMyGenericInterface<T1, T2, int> { ... }
class ClassC<T1> : IMyGenericInterface<T1, char, int> { ... }
class ClassD : IMyGenericInterface<bool, char, int> { ... }

用法(作为一个参数的类型):

void SomeMethod(IMyGenericInterface<int, char, bool> arg) { ... }

5、Explicit type parameters——显式类型参数

注意以下俩种方法只用泛型需要用显式:

public void SomeMethod<T, V>()
{
//没有代码
}
SomeMethod(); // 报错
SomeMethod<int, bool>(); // 工作


public K SomeMethod<K, V>(V input)
{
 return default(K);
}
int num1 = SomeMethod(3); //  报错
int num2 = SomeMethod<int>("3"); //  报错
int num3 = SomeMethod<int, string>("3"); // 工作

五、IDisposable interface——一次性接口

1、在一个只包含托管资源的类中

托管资源是运行时的垃圾收集器知道并受其控制的资源。作为非托管资源的包装器类的Sql连接。这些类已经实现了一次性接口——在您完成操作后,将由您的代码来清理它们。如果类只包含托管资源,则不需要实现终结器(以前称为析构函数,用于在垃圾回收器收集类实例时执行任何必要的最终清理操作。 在大多数情况下,通过使用 System.Runtime.InteropServices.SafeHandle 或派生类包装任何非托管句柄,可以免去编写终结器的过程)。

public class ObjectWithManagedResourcesOnly : IDisposable
{
 private SqlConnection sqlConnection = new SqlConnection();
 public void Dispose()
 {
 sqlConnection.Dispose();
 }
}

2、IDisposable, Dispose

当方法名使用,Dispose()主要用于清理资源,如非托管引用。然而,强迫处理其他资源也可能是有用的,即使它们是被管理的。您可以确保等待GC最终也清理数据库连接,而是在您自己的Dispose()实现中完成。

.NET框架为需要删除方法的类型定义了一个接口:

public interface IDisposable
{
 void Dispose();
}

六、Reflflection——映像

反射用于获取有关动态对象类型和对象属性值的信息。

1: Get a method and invoke it——获取一个方法并调用它

public class Program
{
 public static void Main()
GoalKicker.com – C# Notes for Professionals 333
 {
 var theString = "hello";
 var method = theString
 .GetType()
 .GetMethod("Substring",
 new[] {typeof(int), typeof(int)}); //The types of the method
arguments
 var result = method.Invoke(theString, new object[] {0, 4});
 Console.WriteLine(result);
 }
}

//结果:hell

 

posted @ 2022-12-19 14:27  末叶da  阅读(40)  评论(0)    收藏  举报