第壹章第7节 C#和TS语言对比-函数方法

这节难度有点飙升,我把委托、事件、捕获、闭包、扩展方法等全放一块了。放一块的原因,就是为了让这些概念变得简单些。另外,关于函数和方法这两个名称,有些人觉得在全局使用时,叫函数;在类或对象中时,叫方法。我认为,两者是一个意思,可以互换。

一、函数声明和调用

C#的函数只能在类中声明,而TS可以声明在全局、对象和类中。C#中多了一些修饰符,比如public、static、abtract等,TS中的方法如果在类中申明时,也可以使用一些修饰符。

//C#中声明函数和调用=================================================================
public class Program
{
   
    public static void Main()
    {
   
        //调用实例方法,需要先实例化对象
        var p1 = new Person();
        p1.SayHi(); 
        //通过类名调用静态方法
        int sum = Person.Sum(1,2);
    }
}
public class Person
{
   
    //static静态方法
    public static int Sum(int x, int y)
    {
   
        return x + y;
    }
    //实例方法
    public void SayHi()
    {
   
        Console.WriteLine("Hi, i am MC");
    }
}


//TS中声明函数和调用=================================================================
//全局声明和调用
//***注意,和var定义变量一样,function定义的函数在全局作用域中,定义会被提升到文档的开始
//***函数表达式定义的函数,不存在定义提升的情况
function sum(x:number,y:number):number{
   
    return x + y;
}
sum(1,2);

//通过对象声明
const person = {
   
    name: 'MC',
    sayHi(){
   
      console.log('Hi,i am MC');
    }
}
person.sayHi();

//通过类声明
class Person {
   
  name: string;
  sayHello() {
   
    console.log(`Hello, I'm ${
     this.name}`);
  }
}
let person = new Person();
person.name = "mc";
person.sayHello();

//通过函数的构造函数来创建,最后一个参数为返回值,前面的均为参数。基本不会用到。
//TS中,为基本类型提供了包装函数,都有对应的构造方法
//如number>Number,string>String,array>Array,function>Function,object>Object等
let sum = new Function('x','y','return x+y');
sum(1,2);

二、函数的参数

2.1 值参数(形参和实参)

形参和实参是值复制关系,调用方法时,实参的值复制给了形参。如果是基本类型,直接复制值,如果是引用类型,则复制引用地址。C#和TS,基本一致。

//C#的值参数==========================================================================
public class Program
{
   
    public static void Main()
    {
   
        //静态方法中,不能直接调用实例成员,所以先将自己实例化
        Program program = new Program();

        //值类型参数,方法调用时,直接将值复制给形参
        program.Sum(1, 2); //结果为3

        //引用类型参数,方法调用时,将引用地址复制给形参
        //形参和实参指向的堆中的数据,是同一个
        var p1 = new Person() {
    Name = "MC", Age = 18 };
        program.SayName(p1); //输入MC
        Console.WriteLine(p1.Name); //输出functionMC
    }

    //定义一个使用值类型参数的方法
    public int Sum(int x, int y)
    {
   
        return x + y;
    }

    //定义一个使用引用类型参数的方法
    public void SayName(Person p)
    {
   
        Console.WriteLine(p.Name);
        p.Name = "functionMC";
    }
}

public class Person
{
   
    public string? Name {
    get; set; }
    public int? Age {
    get; set; }
}



//TS的值参数==========================================================================
//参数为值类型(复制值)
function sum(x:number,y:number):number{
   
    return x + y;
}
//调用时分别将1和2的值,复制给了x和y
sum(1,2);

//参数为引用类型。注:此处使用type来约束形参和实参
type Person = {
   
    name: string,
    age: number
}
function sayName(x:IPerson):void{
   
    console.log(x.name);
    x.name = 'functionMC';
}
let p1:IPerson = {
   
    name: 'MC',
    age: 18
}
sayName(p1);//输出MC
console.log(p1.name);//输出functionMC

//***在TS的方法中,存在一个内置对象arguments,实际上实参组成的数组
function test() {
   
    for (let i = 0; i < arguments.length; i++) {
   
        console.log(arguments[i]);
    }
}
test('Hello', 'World', '!');

2.2 引用参数和输出参数(仅C#)

引用参和输出参,是C#中的概念。和值参数不同的是,实参作为形参的别名直接进入方法体中运算。所以,在方法体中如果改变了形参,也会同时改变实参。TS中,因为var的作用域问题,也会产生类似结果。

//C#的引用参数和输出参数=============================================================

//引用参数使用ref,输出参数用out,原理和用法参不多
//在申明和调用的时候都要加ref或out关键词
//调用时,实参只能使用变量,不能使用实际值
//ref只要用于在方法体内改变量的值,out主要用于输出多个方法体的结果
class Program
{
   
    static void Main(string[] args)
    {
   
        Count a1 = new Count();
        int a2 = 10;

        //调用时,也要用ref关键词修饰实参,且实参只能用变量
        RefMethod(ref a1, ref a2);
        Console.WriteLine
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值