1、字段(Field)
作为对象状态一部分的数据变量,字段根据名称和类型来区分。
2、属性(Property)
对于调用者,属性看起来像是字段。但是对于类型的实现者,属性看起来更像是一个方法。属性允许在访问值之前校验输入参数和对象状态。最后属性允许创建只读或只写的“字段”。
例: User类中的m_name为“字段”,而Name则为“属性”,属性代码块中get与set,称为属性访问器。私有的字段m_name可以通过公开的属性Name对它进行读写操作。 通过“属性”读取“字段”值时,将触发get访问器;通过“属性”为“字段”赋值,将触发set访问器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
namespace ConsoleApplication1{ public class User{ private string m_name; //m_name为字段 public string Name //Name为属性,它含有代码块 { //get set为属性访问器 get{ return m_name; //读取(返回m_name值) } set{ m_name = value; //为m_name赋值 } } } class Program{ static void Main(string[] args){ User zs = new User(); zs.Name = "ramsey";////自动触发set访问器,将"ramsey"赋予m_name Console.WriteLine("姓名:" + zs.Name);//自动触发get访问器,显示m_name的值 Console.WriteLine(); } } } |
3、方法(Method)
4、事件(Event)
事件在对象以及其他对象之间实现了通知机制。
类型可见性规则:
- private:成员只能由同一类类型中的其他成员访问。
- family:成员可由派生类型访问,不管那些类型是否是在同一个程序集中。(C#和C++中用protected)
- assembly:成员可由同一个程序集中的任何代码访问。用internal修饰符标识assembly
- family or assembly:成员可由同一个程序集中的任何代码访问。成员可由同一个程序集中的任何类型访问。用protected internal修饰符标识family or assembly。
所有类型都是从System.Object派生的,每个类型的每个对象都保证了一组最基本的方法。
公共方法:
1、Equals 虚方法 如果两个对象有相同的值,返回true。
对象同一性(identity):this和obj实参引用同一个对象
1 2 3 4 5 6 7 8 |
public class Object{ public virtual Boolean Equals(Object obj){ //如果两个引用指向同一个对象,它们肯定包含相同的值 if (this == obj) return true; else return false; } } |
实现Equals的几点:1)如果obj实参为null,就返回false。因为调用非静态Equals方法时,this所标识的当前对象显然不是null。2)如果this和obj实参引用同一个对象,就返回true。在比较包含大量字段的对象时,有助提升性能。3)如果this和obj实参引用不同类型的对象,就返回false。4)针对类型定义的每个实例字段,将this对象中的值与obj对象中的值进行比较。任何字段不想等,返回false。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
namespace ConsoleApplication1{ public class Object{ public virtual Boolean Equals(Object obj){ if(obj==null) return false; if(this.GetType()!=obj.GetType()) return false; return true; //如果两个引用指向同一个对象,它们肯定包含相同的值 //if (this == obj) return true; //else // return false; } } //类型重写Equals时应调用基类的Equals实现 internal sealed class Test{ public Test(){} ~Test() { } public static Boolean operator ==(Test t1, Test t2){ return true; } public static Boolean operator !=(Test t1, Test t2){ return false; } public static Test operator +(Test t1, Test t2){ return null; } public String Aproperty { get { return null; } set { } } //索引器 public String this[Int32 x]{ get { return null; } set { } } //事件 event EventHandler AnEvent; } public class User{ private string m_name; //m_name为字段 public string Name //Name为属性,它含有代码块 { //get set为属性访问器 get{ return m_name; //读取(返回m_name值) } set{ m_name = value; //为m_name赋值 } } public virtual Boolean Equals(User obj) { if (obj == null) return false; if (this.GetType() != obj.GetType()) return false; string temp = this.Name; string temp1 = obj.Name; if (!Equals(this.Name, obj.Name)) return false; return true; //如果两个引用指向同一个对象,它们肯定包含相同的值 //if (this == obj) return true; //else // return false; } } class Program{ static void Main(string[] args){ User zs = new User(); zs.Name = "ramsey1";////自动触发set访问器,将"ramsey"赋予m_name User zz = new User(); zz.Name = "ramsey"; Console.WriteLine("姓名:" + zz.Name);//自动触发get访问器,显示m_name的值 // zz = (Object)zz; Boolean result = zs.Equals(zz); Console.WriteLine("姓名:" + zs.Name);//自动触发get访问器,显示m_name的值 Console.WriteLine(); } } } |
2、GetHashCode
返回对象的值的哈希码。如果某个类型的对象要在哈希表集合(比如Dictionary)中作为键使用,类型应重写该方法。方法应该为不同对象提供良好分布。大多数类型永远不会在哈希表中作为键使用。
3、GetType
返回从Type派生的一个类型的实例,指出调用GetType的那个对象是什么类型。返回的Type对象可以和反射类配合,获取与对象的类型有关的原数据信息。GetType是非虚方法,目的是防止类重写该方法,隐瞒其类型,从而破坏类型安全性。