周广明的博客

.Net & MS SQL Tech
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#中事件委托(delegate)和存取器(Get/Set)简单实例

Posted on 2008-08-27 17:23  Zhougm  阅读(1798)  评论(0)    收藏  举报
关于委托和Set/Get的定义之类,就不说啦,下面只写了具体代码.希望对初学者有所帮助.

  
public class Car
    
{
        
private string name = "BMW";
        
private string color="While";

        
public delegate void ColorChangeHandler(string myColor); //事先声明一个委托,也可以在类的外部声明委托类型
        public event ColorChangeHandler ColorChange; //声明一个事件并指定它的委托类型

        
public string Name
        
{
            
get
            
{
                
return name;
            }

            
set
            
{
                name 
= value;
            }

        }


        
public string Color
        
{
            
get
            
{
                
return color;
            }

            
set
            
{
                color 
= value;
                
if (ColorChange != null// 如果有对象注册
                {
                    ColorChange(
this.color); // 调用所注册对象的方法
                }

            }

        }


        
public string GetCarInfor(string name, string color)
        
{
            
return "This car is s " + name + ",Color is " + color;
        }

    }


    
protected void Page_Load(object sender, EventArgs e)
    
{
        Car car 
= new Car();
        car.ColorChange 
+= new Car.ColorChangeHandler(car_ColorChange);//先注册事件再赋值
        
//car.Name默认为"BMW"
        car.Color = "Black";
    }


    
void car_ColorChange(string color)
    
{
        Response.Write(
"Now,car color is " + color + ",事件执行啦 !");
    }

备注:

 (一)委托

A)委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

B)给委托绑定一个方法,语法是“+=”,取消对方法的绑定,语法是“-=”:

C)使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

public delegate void CarChangeHandler();  //事先声明一个委托,也可以在类的外部声明委托类型

CarChangeHandler delegate1 
= new CarChangeHandler(car_ColorChange);
delegate1 
+= car_NameChange;   // 给此委托变量再绑定一个方法
//
CarChangeHandler delegate1;
delegate1 
= car_ColorChange;   // 第一次用的是“=”,绑定语法。
delegate1 += car_NameChange;   // 给此委托变量再绑定一个方法,这次用的是 “+=”,绑定语法。

 

(二)Get/Set访问器

A)属性按如下方式,根据所使用的访问器进行分类:
只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。
只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
同时带有 get 和 set 访问器的属性为读写属性。

B)在属性声明中,get 和 set 访问器都必须在属性体的内部声明。
它的用途: 一般是对类里面的变量进行操作. 而不是直接对类的变量进行操作。
上面例子通过GET和SET对Car类中公有变量Color进行读写操作,实际就是间接更改color私有变量的值,
当然,如果你不想让用户对color修改,就不要提供set方法. 

C)属性的真实作用不只是为了更改某个成员变量的值,另外一个很大的作用就是: 便于维护.
比如:如果一个类的一个变量int a ,在其它包或命名空间类中使用了1000次,但是过了许久,你想把a改为b,
如果直接对变量a操作的话,就得需求修改整个程序的1000处. 如果用属性了,就不会了,只需改这个方法即可.

public int A
{
set
{
   a 
= value;
}
get
{
   
return a;
}
}
//改为:
public int B
{
set
{
   b 
= value;
}
get
{
   
return b;
}
}

除去这个属性之外的地方根本不需要改变.