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
                    
                
                
            
        
浙公网安备 33010602011771号