《C#技术内幕》学习笔记--方法
原创
©著作权归作者所有:来自51CTO博客作者dking94的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、值参数和引用参数
与C++类似,C#中也有值参数与引用参数传递的区别。
值参数传递:传递给被调用方法的是参数的副本,此时在方法内对参数副本作的修改,并不会影响原来实参数据本身;
引用参数传递:传递给被调用方法的是该参数引用的副本,此时在方法内对参数引用副本作的修改,都会反映到原始数据,即原始实参也会被修改。
值得注意的是,传递引用也可以有两种方式:通过值传递引用和通过引用传递引用。通过值传递引用就是传递了引用的副本,而通过引用传递引用实际上就是传递原来的引用。因此,在这两种情况下,如果为引用参数赋新值,会有微妙的区别。
class myclass
{
public int val;
}
class test
{
public void change(ref myclass mc1, myclass mc2)
{
mc1 = new myclass();
mc1.val = 999;
//mc2 = new myclass();
mc2.val = 999;
}
}
class Program
{
static void Main(string[] args)
{
test tc = new test();
myclass m1 = new myclass();
m1.val = 1;
myclass m2 = new myclass();
m2.val = 1;
tc.change(ref m1, m2);
Console.WriteLine("m1.val={0},m2.val={1}", m1.val, m2.val);
}
}
如上代码,如果类test中的注释行被注释掉,则输出为:999,999
如果注释行的代码不被注释而起作用,那么输出为:999,1
原因就是mc2是通过值传递的引用。
二、ref和out
ref和out关键字都是指明参数是引用类型的,其区别是:
使用ref,则参数必须在使用前初始化,而在方法内被声明为ref的参数可以被修改,也可以不被修改;
使用out,则参数在使用前可以不初始化,但是在方法内部(方法返回之前)必须对声明为out的参数赋值。当参数是引用类型时(比如对象),这种“赋值”不是指某些字段、属性赋值,而是对对象赋值。
三、方法重载
重载的最低要求是参数列表不同(包括参数次序不同),而返回类型、访问修饰符不同都不是重载。
使用ref或out来区分的,视为重载,但是不能同时使用二者:
public void read(string s)
{
Console.WriteLine(s);
}
//Either of following two is ok,but not both
public void read(ref string s)
{
Console.WriteLine(s);
}
public void read(out string s)
{
Console.WriteLine(s);
}
四、重载构造函数
一旦重载了构造函数,编译器将不再提供默认构造函数,可以自己定义一个无参数的构造函数。
五、继承与重载
当联合使用继承和重载时,C#的做法类似于java,而不是C++。C++的重载概念仅限于同一个类中的方法,而C#中派生类和基类的方法仍然被认为是继承。
六、方法隐藏
类似于C++,如果在基类声明一个方法,派生类中重写该方法并使用new关键字,则隐藏基类方法。(new是默认的,可省略。)
class Employee
{
public void Calpay()
{
Console.WriteLine("Employee.Calpay");
}
}
class SalariedEmployee:Employee
{
new public void Calpay()
{
Console.WriteLine("SalariedEmployee.Calpay");
}
}
class Program
{
static void Main(string[] args)
{
Employee e = new Employee();
e.Calpay();
SalariedEmployee se = new SalariedEmployee();
se.Calpay();
}
}
输出为:Employee.Calpay
SalariedEmployee.Calpay
七、多态、覆盖
与C++类似,基类方法声明时间关键字virtual,派生类想要覆盖则在声明时加关键字override。
覆盖的、重定义的方法的方分级别必须与它重定义的虚函数级别一致(不低于),虚函数不能声明为private。
new和virtual可以同时使用,不过此时是为这个虚函数建立了一个新的级别。
如果从构造函数调用虚函数,C#类似于java,而不是C++,调用最早派生的重定义的方法。(此时派生类的对象有可能还没有完全构造好。)
八、静态方法
与C++类似,使用static关键字。
静态方法可以访问类中所有静态成员,但不能访问普通实例成员。反过来,非静态方法都可以访问静态成员和非静态成员。
构造函数中不能通过this访问静态成员。
C#的静态方法只能通过 “类名.方法” 的形式访问。
九、静态构造函数
可以声明静态构造函数:不能有参数,不能有访问修饰符,只能访问静态成员。将先调用静态构造函数,再调用非静态。不构造对象,直接调用静态方法或成员也会触发调用静态构造函数。
下一篇:C#基础中的体会
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C#雷赛运动控制卡学习记录
C#雷赛运动控制卡基础运动控制
Text Click 运动控制 -
spring技术内幕笔记1
spring笔记
spring -
C# IoC学习笔记
一、引言 IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先
依赖注入 依赖关系 控制反转 配置文件 构造函数