C# 对象和类
2016-08-02 16:19
113 查看
对象:是对客观事物的抽象
类 : 是对对象的抽象
类和对象是面向对象编程的一个重要组成,类是对象的模板,对象是类的实例。
弱引用:只要GC运行都会回收对象并释放内存。
什么时候选择弱引用?
当对象很大,很少被访问,并且可以在任意时候进行释放对象内存时,可以选择弱引用。
弱引用只要GC运行就会被释放,往往会使程序产生一些BUG,所以使用弱引用前先判定引用是否还存在。
代码中使用,IsAlive属性判断当前对象引用是否已被垃圾回收,如果返回true说明没有被回收,可以通过Target强转为相应的对象。GC.Collect手动既刻执行垃圾回收。这里使用release编译,采用debug模式没有效果
关键字:使用partial修饰在class前面就可以标识该类是部分类。
使用场景:开发窗体程序winfrom时,经常使用部分类。系统创建设计类,程序员只需要关注另一部分的逻辑实现就行,并行处理很方便。
代码中虽然有用到三个class和两个interface,其实我们通过IL反编译,生成的IL代码只有两个类和两个接口
使用场景:如果一个程序集,并没有源代码或者在某种特殊情况,源码不能做任何改变,但是此时又必须要往类中新增一个方法才能满足业务需求,这时候可以使用扩展方法
语法:扩展方法必须是静态的,方法第一个参数需要以this标识,后面跟上需要扩展的类类型。
弱引用的基本概念和使用场景以及和强引用的区别?
部分类的基本概念和使用?
扩展方法的基本概念和使用?
类 : 是对对象的抽象
类和对象是面向对象编程的一个重要组成,类是对象的模板,对象是类的实例。
类
类和结构的区别
1.关键字异同:类使用class,结构使用 2.存储地址不同:类存储在托管堆属于引用类型,结构属于值类型,存储在栈中。 3. 继承异同:类可以继承类或接口,结构不能继承类或结构只能继承接口 4. 构造函数不同:结构无论如何系统都会为其创建一个默认无参构造函数,所以在结构中定义无参构造函数是错误的。 5. 字段初始值:结构体中不能有字段的初始值,只能在结构体中定义有参构造函数为字段初始化 6. 析构函数:只有类类型才有析构函数,结构没有析构函数、
弱引用
强引用:在应用程序代码内实例化一个类或结构时,只要代码引用,都会形成强引用。在对象的作用域类,垃圾回收器都不会回收对象使用的内存。弱引用:只要GC运行都会回收对象并释放内存。
什么时候选择弱引用?
当对象很大,很少被访问,并且可以在任意时候进行释放对象内存时,可以选择弱引用。
弱引用只要GC运行就会被释放,往往会使程序产生一些BUG,所以使用弱引用前先判定引用是否还存在。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication20 { class Program { static void Main(string[] args) { WeakReference mathref = new WeakReference(new MathTest()); MathTest math; if (mathref.IsAlive) { math = mathref.Target as MathTest; math.value = 10; Console.WriteLine(math.value); } else { Console.WriteLine("Reference is not available."); } GC.Collect(); if (mathref.IsAlive) { math = mathref.Target as MathTest; math.value = 20; Console.WriteLine(math.value); } else { Console.WriteLine("Reference is not available."); } } } class MathTest { public int value { get; set; } } }
代码中使用,IsAlive属性判断当前对象引用是否已被垃圾回收,如果返回true说明没有被回收,可以通过Target强转为相应的对象。GC.Collect手动既刻执行垃圾回收。这里使用release编译,采用debug模式没有效果
部分类
概念:从名字上来看,部分类就是把类拆分开来,即把一个类放在多个代码文件中。关键字:使用partial修饰在class前面就可以标识该类是部分类。
使用场景:开发窗体程序winfrom时,经常使用部分类。系统创建设计类,程序员只需要关注另一部分的逻辑实现就行,并行处理很方便。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication20 { class Program { static void Main(string[] args) { TheBigClass c = new TheBigClass(); c.MethodOne(); c.MethodTwo(); c.MethodBase1(); c.MethodBase2(); } } partial class TheBigClass:TheBigClassBase2 { public void MethodOne() { Console.WriteLine("MethodOne."); } public void MethodBase2() { Console.WriteLine("MethodBase2."); } } partial class TheBigClass:TheBigClassBase1 { public void MethodTwo() { Console.WriteLine("MethodTwo."); } public void MethodBase1() { Console.WriteLine("MethodBase1."); } } interface TheBigClassBase1 { void MethodBase1(); } interface TheBigClassBase2 { void MethodBase2(); } }
代码中虽然有用到三个class和两个interface,其实我们通过IL反编译,生成的IL代码只有两个类和两个接口
扩展方法
概念: 可以在不破坏源代码的情况下对类进行扩展。使用场景:如果一个程序集,并没有源代码或者在某种特殊情况,源码不能做任何改变,但是此时又必须要往类中新增一个方法才能满足业务需求,这时候可以使用扩展方法
语法:扩展方法必须是静态的,方法第一个参数需要以this标识,后面跟上需要扩展的类类型。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication20 { class Program { 4000 static void Main(string[] args) { MathTest math = new MathTest(10); math.printf(); math.AddValue(20); math.printf(); } } static class Extension { public static void AddValue(this MathTest math, int value) { math.value += value; } } class MathTest { public int value { get; set; } public MathTest(int value) { this.value = value; } public void printf() { Console.WriteLine(value); } } }
小结
类和结构的区别?(关键字不同,继承异同,存储地址不同,构造函数不同,析构函数区别,字段初始值区别)弱引用的基本概念和使用场景以及和强引用的区别?
部分类的基本概念和使用?
扩展方法的基本概念和使用?
相关文章推荐
- C#面向对象名词比较(三)
- 迈向面向对象程序设计的第一步:封装(c#描述)
- C#和JAVA5.0可以在String对象中使用类似天C的printf()格式化函数
- 使用 Visual C# .NET 按值将对象封送到远程服务器
- C#实现对象的Xml格式序列化及反序列化
- [导入]C#面向对象设计模式纵横谈(4):Abstract Factory 抽象工厂模式(创建型模式)
- 希望这篇文章对理解C#的对象模型有所帮助
- C#实现对象的Xml格式序列化及反序列化
- C# 3.0语言新特性(语言规范):4 对象和集合初始化器
- 一个克隆对象的C#基类
- 面向对象思想 - 关于对象(材料来自thinking in Java,这些东西是跟C#相通的,跟语言无关)
- HOW TO:使用 Visual C# .NET 从数据库填充 DataSet 对象
- C#简介- 类和对象,选自《C#编程语言详解》,送给新手
- c#中用axWebBrowser中提交表单,或点击某个对象
- 用C#创建COM对象
- c#问答篇:对象与引用变量-----初学者的困惑
- 基于对象的C#
- 在C#中如何用字符串来替代对象的名称
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
- 《C# 设计模式》笔记: 第4章 在C#中使用类和对象