值类型与引用类型(StuctClass)

值类型有:Int Double Float Decimal Boolean Byte Char Single Enum Structure 枚举 结构体
结构体属于值类型:

1 class MyStuct
2 {
3     public int Value;
4 }

结构体可以实现接口:

 1 interface IPromotion
 2 {    
 3     void promote();
 4 }
 5 
 6 struct Employee : IPromotion
 7 {    
 8     public string Name;    
 9     public int JobGrade;    
10     public void promote()    
11     {        
12         JobGrade++;    
13     }    
14     public Employee(string name, int jobGrade)    
15     {        
16         this.Name = name;        
17         this.JobGrade = jobGrade;    
18     }    
19     public override string ToString()    
20     {        
21         return string.Format("{0} ({1})", Name, JobGrade);    
22     }
23 }

结构体的使用方法:

 1 class Program    
 2 {    
 3     static void Main(string[] args)    
 4     {        
 5         Employee employee = new Employee("Cool Guy", 65);        
 6         IPromotion p = employee;        
 7         Console.WriteLine(employee);        
 8         p.promote();        
 9         Console.WriteLine(employee);    
10     }
11 }

引用类型:String Class Array Interface Delegate 数组,指针,接口;
类属于引用类型:

 1 class MyClass
 2 {
 3     public int Value;
 4 }
 5 
 6 class Program    
 7 { 
 8     static void Main(string[] args)
 9     {
10         MyClass classobj1=new MyClass();
11         classobj1.Value=0;
12         MyClass classobj2=new MyClass();
13         classobj2.Value=1;
14         
15         MyStuct stuctobj1=new MyStuct();
16         stuctobj1.Value=0;
17         MyStuct stuctobj2=new MyStuct();
18         stuctobj2.Value=1;
19         
20         Console.WriteLine(classobj1.Value);//-----1
21         Console.WriteLine(classobj2.Value);//-----1
22         Console.WriteLine(stuctobj1.Value);//-----0
23         Console.WriteLine(stuctobj2.Value);//-----1
24         
25         Console.ReadKey();    
26     }
27 }

值类型和引用类型的比较:

1:初始化方面:

值类型分配在栈上,变量本身包含了实例的所有字段。 引用类型分配在托管堆上,被分配在托管堆上的对象都有一些与之相关联的额外成员要被初始化, 分配完后返回对象位于位于托管堆地址。

2:内存释放方面:

值类型没有分配托管堆,所以不受GC控制,一旦值类型不被引用, 为他分配的存储空间就会立即释放。值类型也有Finalize方法,但是回收资源的时候,CLR不会调用该方法。 引用类型在托管堆中分配的有内存空间,所以资源回收的时候受GC控制。

3:继承方面:

 值类型不能作为基类,所以值类型里边不要有虚方法,也不要有抽象方法, 所有的方法都隐含有sealed修饰符。

4:用途方面:

值类型不要频繁用于方法参数的传递,因为参数以传值的方式传递,导致值类型的字段频繁被拷贝。 值类型不要作为方法的返回值频繁返回,原因同上。 值类型不要频繁用于ArrayList,Hashtable类,因为很容易频繁装箱。

注意:

1》值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object。
2》值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量保存了其数据的引用地址,因此以引用方式进行参数传递时会影响到参数本身,因为两个变量会引用了内存中的同一块地址。
3》值类型有两种状态:装箱和未装箱,运行库提供了所有值类型的已装箱形式;而引用类型通常只有一种形式:装箱。
4》典型的值类型为:struct,enum以及大量的内置值类型;而能称为类的都可以说是引用类型。
5》值类型的内存不由GC(垃圾回收,Gabage Collection)控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常struct比class更高效;而引用类型的内存回收,由GC来完成,微软甚至建议用户最好不要自行释放内存。
6》值类型是密封的(sealed),因此值类型不能作为其他任何类型的基类,但是可以单继承或者多继承接口;而引用类型一般都有继承性。 
7》值类型不具有多态性;而引用类型有多态性。
8》值类型变量不可为null值,值类型都会自行初始化为0值;而引用类型变量默认情况下,创建为null值,表示没有指向任何托管堆的引用地址。对值为null的引用类型的任何操作,都会抛出NullReferenceException异常。

原文地址:https://www.cnblogs.com/yinyuejie/p/2679275.html