C#学习之静态成员和非静态成员,构造函数,方法,方法参数,操作符重载,事件


静态成员和非静态成员:
若将类中的某个成员声明为static,该成员称为静态成员。类中的成员要么是静态,要么是非静态。一般说来,静态成员是属于类所有的,非静态成员则属于类的实例-对象。
类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域。而类的静态成员属于类所有,为这个类的所有实例共享。无论创建了多少个副本,一个静态成员字内存中只占有一块区域。

构造函数:
使用构造函数要注意以下几个问题:
1、一个类的构造函数通常与类名相同。
2、构造函数不声明返回类型。
3、一般的,构造函数总是public类型的。如果是private类型的,表明类不能被实例化,这通常用于只含有静态成员的类。
4、在构造函数中不要做对列的实例进行初始化以外的事情,也不要尝试显示的调用构造函数。

方法:
方法是类中用于执行计算或其他行为的成员。其声明格式为:mothod-header  method-body
其中方法头method-header的格式:
attributes method-modyfiers return-type member-name(formal-parameter-list)
传递方法的参数字方法的形式化参数表formal-parameter-list中声明,将随后进行详细论述。
在方法的声明中,至少包括方法名称、修饰符和参数类型,返回值和参数名则不是必须的。
方法修饰符:new public protected internal private static virtual sealed override abstract extern
对于使用abstract和extern修饰符的方法,方法的执行体method-body仅仅只有一个简单的分号。其他所有的方法执行体中应包含调用该方法所要执行的语句。
方法中参数:
1、值参数
当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将次拷贝传递给该方法。被调用的方法不会修改内存中的实参的值,所以使用值参数时,可以保证实际值的安全。在调用方法时,如果形式化参数的类型是值参数的话,调用的实参数的表达式必须保证是正确的值表达式。
2、引用类型参数并不开辟新的内存区域。当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法。以ref修饰符声明。
3、输出类型参数也不开辟新的内存区域。与引用型参数的差别在于,调用方法前无需对变量进行参数化。输出类型参数用于传递方法返回的数据。
out修饰符后应跟随与形参的类型相同的类型声明。在方法返回后,传递的变量被认为经过初始化。
4、如果形参表中包含了数组型参数,那么它必须在参数中位于最后。另外,参数只允许是一维数组。比如,string[]和string[]类型都可以作为数组类型参数,而string[,]则不能。最后,数组类型参数不能再有ref和out修饰符。
静态和非静态方法:
C#中使用了static修饰符的方法为静态方法,反之则是非静态的。
静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例。非静态方法可以访问类中的任何成员,而静态方法只能访问类中的静态成员。如果静态方法的参数是类的实例,便可以访问实例中的成员。
操作符重载:
1、使用成员方法重载操作符
格式:type operator operator-name(formal-param-list)
可以重载的操作符:
+ - ! ~ ++ -- true false * / % & | ^ << >> == != > < >= <=
不可重载的操作符:
= && || ?: new typeof sizefo is
一元操作符重载:
一元操作符重载是操作符只作用于一个对象,此时参数表为空,当前对象作为操作符的单操作数。
using System;
class Player
{
public int neili,tili,jingyan,neili_r,tili_r;
public Player()
{
     neili=10;
     tili=50;
     jingyan=0;
     neili_r=50;
     tili_r=50;
}
public static Player operator ++(Player p){
     p.neili=p.neili+50;
     p.tili=p.tili+100;
     p.neili_r=p.neili;
     p.tili_r=p.tili;
     return p;
}
}
二元操作符重载:
大多数情况下我们使用二元操作符重载。这时参数表中有一个参数,当前对象作为该操作符的左操作数,参数作为操作符的右操作数。
Using System;
class DKR
{
public int x,y,z;
public DKR(int vx,int vy,int vz)
{
x=vx;y=vy;z=vz;
}
public static DKR operator +(DKR d1,DKR d2)
{
DKR dkr=new DKR(0,0,0);
dkr.x=d1.x+d2.x;
dkr.y=d1.y+d2.y;
dkr.z=d1.z+d2.z;
return dkr;
}
}
class test
{
public static void Main(){
DKR d1=new DKR(3,2,1);
DKR d2=new DKR(0,6,5);
DKR d3=d1+d2;
Console.WriteLine("the 3d location of d3 is:{0}{1}{2}",d3.x,d3.y,d3.z);
}
}
}

事件:
形象的说,事件(event)就是类或对象用来“发出通知”的成员。通过提供事件句柄,客户能够把事件和可执行代码联系在一起。
事件的声明:
attributes event-modifiers event type variable-declarators;
attributes event-modifiers event type member-name{
event-accessor-declarations}
事件的修饰符event-modifier可以是:
new public protected internal private static sealed override abstract
static,virtual,override和abstract修饰符同一时刻只能出现一个。事件的声明中可以包含事件访问说明,或者依靠编译器自动提供一个访问器;它可以省略事件访问说明,一次定义一个或多个事件。
事件的预定和撤销:
下面的例子中,声明了一个使用Button类的登录对话框类。对话框类含有两个按钮:ok和cancel按钮。
public class LoginDialog:Form
{
Button OkButton;
Button CancelButton;
public LoginDialog(){
OkButton=new Button(...);
OkButton.Click+=new EventHandler(OkButtonClick);
CancelButton=new Button();
CancelButton.Click+=new EventHandler(CancelButtonClick);
}
void OkButtonClic(object sender,EventArgs e){//处理事件}
void CancelButtonClick(object sender,EventArgs e)
{//处理事件}
}
事件预定是通过为事件加上左操作符"+="来实现的
OkButton.Click+=new EventHandler(OkButtonClick);
事件的撤销采用左操作符“+=”:
OkButton.Click-=new EventHandler(OkButtonClick); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值