提到“面向对象”就必须要说到“面向过程”: 面向过程:面向完成这件事的过程,强调的是完成这件事的动作(针对每个人量身定做的动作)。 面向对象:找个对象帮你做事,可以写出通用代码,屏蔽差异。 “面向对象”是这样做的:门可以被打开 总结:面向过程强调的是人,面向过程强调的是对象 二。代码描述:代码中描述这个对象的属性(特征)和方法(行为)。 如果找对象:对象必须是“看得见,摸得着”(特指每一个) 对象的共性:有共同的属性和方法。 /(行为)描述对象的行为 构造函数; }写好一个类以后我们要创建这个类的对象,创建类对象的过程称为类的实例化(通过关键字 new) 在main函数中实例化 格式为: 1. _age=10; 类不占内存,但对象是占内存的 (类是抽象出来的,而对象是实实在在存在的)
对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组就行了。 万物皆可对象,举个例子:一台电脑。我们就可以把电脑看成一个对象。 数组,就是变量中元素的集合,详见本人之前写的: C#之 数组的理解和使用 第一种: 常规的写法 string[] xxx = {} 例如我们写一个名字集合的数组: string
如果你的类型重写了Equals方法,但是没有重写GetHashCode方法,C#编译器会发出一条警告,提示你重写GetHashCode方法,之所以重写Equals方法的同时要求重写GetHashCode : 1、获取键的哈希码 2、该哈希码标识了现在要以顺序的方式搜索哈希桶 3、根据该哈希码查找与指定键对象相等的键对象. 但是,采用这个算法来存储和查找键,一旦修改了一个键对象,键对应的哈希码并不会进行相应的更新,该哈希码对应的键值对还挂在这个hash码下,所以这就导致了集合再也找不到这个对象。 所以,需要修改哈西表中的键对象时,正确的做法是移出原来的键值对, 修改键对象,将新的键值对对象添加回哈希表. ,在对象生存期"永不改变" 5、算法执行速度尽量快 6、包含相同值的不同对象应返回相同的哈希码。
C#对象初始化 之前在学习过程中只是知道该如何初始化对象,但是却不明白为何要这么做,不这么做有什么问题。 1、 在 栈内存为引用开辟空间 2、 在 堆内存为对象开辟空间 3、 对 对象的成员变量进行 默认初始化 //默认初始化为null 4、 对 对象的成员变量进行 显示初始化 //赋予初始值 5、 通过 构造方法对 对象的成员 变量赋值 6、 对象初始化完毕,把对象地址赋值给引用变量 二 、变量声明后和变量赋值为null或变量调用了new的区别。 C# 引用类型和值类型 1、引用类型 FCL(Framework)中的大多数类型都是引用类型,引用类型总是在托管堆中分配的,C#的new操作符会返回对象的内存地址,也就是指对象数据的内存地址。 在使用引用类型时,存在以下性能问题,这是我们在开发中必须要注意的: a、内存必须从托管堆上分配(也就是说每new一个对象,会占用内存,对象过多就会导致内存占用) b、 堆上分配的每个对象都有一些额外的成员
属性 作用:保护字段,对字段的赋值取值进行限定 意思是在初始化对象的时候防止出现不是事实的违规操作 如将性别赋值为‘中’ 本质:两个方法 get方法和set方法。 语法为: 类对象名.属性名 get,set对字段的赋值取值进行限定的方法为: (1)通过set方法(赋值)value值 在set中使用判断语句(if系列) 例如:对于年龄 本质为:set{_age
(2)在调用静态成员的时候要使用:对象名.实例成员。 (3)在调用静态成员的时候要使用:类名.静态成员。 总结:静态成员使用类名去调用,非静态成员使用对象名去调用。 非静态创建对象并赋值(逐一赋值)会造成代码冗余,所以产生构造函数来赋值 构造函数: 作用:初始化对象(给对象的每个属性依次赋值),构造函数是一个特殊的方法。 语法: public 类名(参数) { 属性赋值; } 创建对象时调用构造函数 关键字new new关键字做了三件事: (1)在内存中开辟了一块空间。 (2)在开辟的空间创建对象。 (3)调用对象的构造函数进行初始化对象。 类当中默认有一个无参的构造函数 ,默认的构造函数会被我们新建的构造方法覆盖 无参的构造函数:public 类名() { } 有参的构造函数:public 类名(参数) { 赋值; } 在创建对象时(
操作时,string 会产生一个新的实例(开辟空间存数据)用StringBuilder来替代 使用:(1)创建StringBuilder对象 StringBuilder sb=new
总结:在一个项目中引用另一项目的类步骤有二:(1)在该项目的方案下的属性栏中添加引用 (2)引用命名空间 using +需要用的类的项目名称(using语句下的第一句代码) 二.值类型与引用类型(c#
PrintFields() { 36 Console.WriteLine("x={0},y={1}", x, y); 37 } 38 } 39} 这里备忘一下c# 对象初始化顺序及C++对象初始化顺序: C#对象初始化 1. 对于变量和静态构造函数,派生对象在基对象之前被初始化.比如C类派生自B类,B类派生自A类,那么变量和静态构造函数被初始化次序是C-B-A. 4. 除了实例构造函数。 如果在初始化一个对象时需要调用一些虚方法,应在完整构造该对象的地方使用两阶段的构建,并随后调用已构造对象的初始化方法。 C++构造函数调用顺序 1. 成员类对象构造函数如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序; 5.
利用BinaryFormatter进行序列化 有时候需要将对象保存到文件里、存储到数据库中或者通过网络传输到远程的计算机中,这个时候就需要将对象转化成字节流的形式,以便进行传输或者持久化。 这个过程叫做对象的序列化,而把已经序列化的字节流重新包装成活动的对象的过程叫做反序列化。.NET提供了完善的对象序列化和反序列的机制,因此我们可以很方便地进行对象的序列化和反序列化操作。 并不是所有的对象都可以序列化。. 这需要一个System.Xml.Serialization.XmlSerializer对象,然后将要序列化的对象的类型传入其构造器,构造出合适的XML格式,然后调用其对应的Serialize方法将对象序列化到文件中 格式化器序列化对象后OnDeserializing格式化器反序列化对象前OnDeserialized格式化器反序列化对象后
int len = 5; for(i = 0; i < len; i ++) { bbb[i] = i; } } 然后就出现这样的报错了 《传递数组对象报错 “未将对象引用设置到对象的实例”》 分析: 从字面上理解这句话为,传递的数组对象(指的是数组aaa),没有将对象引用(指定的bbb,实际也是aaa本身,因为他们是同一片地址)设置到对象的实例(指的是没有实例化数组
创建一个类 上面简单的介绍了面向对象的概念,现在先创建一个C#类,然后介绍一下这个类需要注意的地方: public class Person { private static int count 访问控制符 在讲三大特性之前,先介绍一下 C#的访问控制。 继承 C#的继承是单继承,也就是说一个类只有一个父类,如果不指明父类,那么它的父类就是object。换句话说,object是C#继承体系里的根,也就是所有类的祖先类。 C#的继承用: 表示,即 class B: A表示B继承A。 Object 类 常用方法 object 作为基类定义了四个基本方法,这四个方法是所有子类都有的方法,也是一个核心方法: Equals(object obj) 这是一个很重要的方法,它是 C#中判断两个对象是否相等的依据
那么,对象呢?如何传递? 2、序列化 想到了,Newtonsoft.Json.dll这个神器。相对于内建的XmlSerializer这个东西,我更喜欢用Json。 其实就是用了WM_COPYDATA的字符串传递功能,加上Json的序列化、反序列化,而实现c#不同进程间的对象传递 4、效果图: ? 代码如下: public static class SerializeHelper { /// /// 序列obj对象为base64字串 0}失败,原因:{1}", obj, ex.Message)); } } /// /// 反序列化字符串到对象 /// /// <param name="str">要转换为对象的字符串</param> /// <returns>反序列化出来的对象
dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。
Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,在热路径下,也就是频繁调用的模块,如果调用了委托的 GetInvocationList 方法,那么将视委托的大小,每次创建不同大小的新数组对象 ,而在频繁调用的模块,将会创建大量的对象 如以下代码的一个委托,当然对于事件来说也是如此 Action action = Foo; for (int i
User { public string Name { get; set; } public int Age { get; set; } } *当声明一个对象的时候
System.Runtime.Serialization.Formatters.Binary; public class SerializationUnit { /// /// 把对象序列化为字节数组 bytes.Length); ms.Close(); return bytes; } /// /// 把字节数组反序列化成对象
,python解释器默认调用_init_() 方法 当删除一个对象时,python解释器也会默认调用_del_() 方法(有点析构函数的味道) 当有1个变量保存了对象的引用时,此对象的引用计数就会加1 老师笑而不语道:“小家伙原来不仅仅是体重增加啊,这求知欲也是大大的增加呢 ~ 且听我慢慢道来” ---- 类在程序里面也是对象(你姑且可以认为所有的类都类似于C#里面的静态类),而通过类实例化的对象,叫实例化对象 实例属性 --> 实例对象相互之间不共享 一般我们都是在 __init__中定义 类属性(类似于C#里面的静态字段) --> 属于类对象,多个实例对象之间共享 注意一下:相同名称的实例属性将屏蔽掉类属性 (尽量别同名) 类属性除了可以通过 类名.类属性 访问外,还可以直接 实例对象.类属性 (C#中抽象类和静态类是不能被实例化的) 来个案例更直观点: class Person(object): 多个构造函数(Python里面不能有同名函数) or 你需要 对类属性、类方法操作之类的 静态方法:一般 都是独立功能,类似于函数,只不过在面向对象里面一般这么用 ---- 1.9 C#封装案例 C#面向对象比较优美
ASP.NET的内置对象 ASP.NET的内置对象 使用Response页面跳转传值 使用request对象获取客户端信息 Application对象 Session对象 Cookie对象 Server 对象 疑难解答: Request对象获取客户端数据的两种方式的区别: Cookie对象与Session对象的使用场景选择 练习实现用户七天免登录功能 ASP.NET的内置对象 使用Response页面跳转传值 Session对象将于联机机器离线时终止,也就是网站使用者关闭浏览器或者超过设定的Session对象的有效时间时,Session对象就会自动释放或关闭。 写入和获取Cookie数据 Cookie对象的读写都和客户端有关系,所以读操作都需要借助Request对象,写需要借助Response对象。 Cookie对象与Session对象的使用场景选择 实际应用中,在向客户端写入Cookie数据时都会设置Cookie的过期时间,Cookie对象和Session对象具有相同的功能,两者区别在于Cookie
,python解释器默认调用_init_() 方法 当删除一个对象时,python解释器也会默认调用_del_() 方法(有点析构函数的味道) 当有1个变量保存了对象的引用时,此对象的引用计数就会加1 老师笑而不语道:“小家伙原来不仅仅是体重增加啊,这求知欲也是大大的增加呢 ~ 且听我慢慢道来” ---- 类在程序里面也是对象(你姑且可以认为所有的类都类似于C#里面的静态类),而通过类实例化的对象,叫实例化对象 实例属性 --> 实例对象相互之间不共享 一般我们都是在 __init__中定义 类属性(类似于C#里面的静态字段) --> 属于类对象,多个实例对象之间共享 注意一下:相同名称的实例属性将屏蔽掉类属性 (尽量别同名) 类属性除了可以通过 类名.类属性 访问外,还可以直接 实例对象.类属性 (C#中抽象类和静态类是不能被实例化的) 来个案例更直观点: class Person(object): # 多个构造函数(Python里面不能有同名函数) or 你需要 对类属性、类方法操作之类的 静态方法:一般 都是独立功能,类似于函数,只不过在面向对象里面一般这么用 ---- 1.9 C#封装案例 C#面向对象比较优美
腾讯云对象存储数据处理方案主要针对于存储于腾讯云对象存储COS中的数据内容进行处理加工,满足压缩、转码、编辑、分析等多种诉求,激活数据价值。
扫码关注腾讯云开发者
领取腾讯云代金券