一.所有类型都是从System.Obejct派生

1.下面两个类型定义是完全一致的:

1 class Employee{
2     ...
3 }
4 class Employee:System.Object{
5     ...
6 }

 

2.System.Object的公共实例方法

  a.Equals 判断对象是否具有相等的值

  b.GetHashCode 返回对象值的哈希码

  c.ToString 该方法默认返回类型的完整名称( this.GetType().FullName )

  d.GetType 返回从Type派生的一个对象的实例,指出调用GetType的那个对象是什么类型

 

3.System.Object的受保护方法

  a.MemberwiseClone 这个非虚方法能创建类型的新实例,并将新对象的实例字段设与this对象的实例字段完全一致.返回的是一个对新实例的引用( 这是译文,说实话,没看懂,然后查阅了MSDN,其实这个方法的功能是创建一个浅表副本,是创建一个新对象,然后将当前对象的非静态字段复制到这个浅表副本中,即新对象中.如果字段是值类型,则执行逐位复制.如果是引用类型,则复制引用而不复制引用对象,因此,原始对象及其副本引用同一对象 )

  以下是浅表复制和深入复制操作的区别

  1     public class IdInfo
  2     {
  3         public int IdNumber;
  4 
  5         public IdInfo(int IdNumber)
  6         {
  7             this.IdNumber = IdNumber;
  8         }
  9     }
 10 
 11     public class Person
 12     {
 13         public int Age;
 14         public string Name;
 15         public IdInfo IdInfo;
 16 
 17         //浅表复制
 18         public Person ShallowCopy()
 19         {
 20             return (Person)this.MemberwiseClone();
 21         }
 22 
 23         //深入复制
 24         public Person DeepCopy()
 25         {
 26             Person other = (Person)this.MemberwiseClone();
 27             other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
 28             return other;
 29         }
 30     }
 31 
 32     class Program
 33     {
 34         public static void DisplayValues(Person p)
 35         {
 36             Console.WriteLine("Name:{0:s} , Age:{1:d}",p.Name,p.Age);
 37             Console.WriteLine("Value:{0:d}",p.IdInfo.IdNumber);
 38         }
 39 
 40         static void Main(string[] args)
 41         {
 42             //创建一个Person对象
 43             Person p1 = new Person();
 44             p1.Age = 42;
 45             p1.Name = "Sam";
 46             p1.IdInfo = new IdInfo(5042);
 47 
 48             //复制p1给p2
 49             Person p2 = (Person)p1.ShallowCopy();
 50 
 51             //展示这些值
 52             Console.WriteLine("p1实例的值");
 53             DisplayValues(p1);
 54             Console.WriteLine("p2实例的值");
 55             DisplayValues(p2);
 56 
 57             Console.WriteLine("===========改变p1值的属性并展示p1和p2的值的时候===========");
 58 
 59             //改变p1值的属性并展示p1和p2的值的时候
 60             p1.Age = 32;
 61             p1.Name = "Frank";
 62             p1.IdInfo.IdNumber =7080;
 63             Console.WriteLine("p1实例的值");
 64             DisplayValues(p1);
 65             Console.WriteLine("p2实例的值");
 66             DisplayValues(p2);
 67 
 68             //从结果可以看出,浅表复制由于引用类型复制了对象的引用,当该浅表中所对应原本对象的引用值发生改变时,则浅表中引用类型值
 69             //也会发生改变,而原对象的值类型发生改变时,浅表中值类型的值却不会改变
 70 
 71             Console.WriteLine("===========创建一个深入复制的对象给p3===========");
 72 
 73             //创建一个深入复制的对象给p3
 74             Person p3 = p1.DeepCopy();
 75             p1.Name = "Gergoe";
 76             p1.Age = 22;
 77             p1.IdInfo.IdNumber = 6660;
 78             Console.WriteLine("p1实例的值");
 79             DisplayValues(p1);
 80             Console.WriteLine("p3实例的值");
 81             DisplayValues(p3);
 82 
 83             //从结果可以看出,深入复制是把原对象的引用类型也进行了复制,也就是说,把原对象的引用类型字段重新new了...!
 84 
 85             Console.ReadLine();
 86 
 87             //以上代码结果:
 88             //p1实例的值
 89             //Name:Sam , Age:42
 90             //Value:5042
 91             //p2实例的值
 92             //Name:Sam , Age:42
 93             //Value:5042
 94             //===========改变p1值的属性并展示p1和p2的值的时候===========
 95             //p1实例的值
 96             //Name:Frank , Age:32
 97             //Value:7080
 98             //p2实例的值
 99             //Name:Sam , Age:42
100             //Value:7080
101             //===========创建一个深入复制的对象给p3===========
102             //p1实例的值
103             //Name:Gergoe , Age:22
104             //Value:6660
105             //p3实例的值
106             //Name:Frank , Age:32
107             //Value:7080
108         }
109     }
MemberwiseCopy区别深入复制

相关文章: