Unity相关知识体系梳理(一)c#语言_4

Unity相关知识体系梳理(一)c#语言_4

昨天我们进行了C#的第三部分的梳理,我们今天将接着昨天的顺序开始今天的讲解,今天讲解的主要部分是函数参数,修饰符,类型转换等。

函数方法(二)

昨天我们说道函数的组成部分有 修饰符+ 返回值+ 函数名+(参数)+{函数体}

函数参数

当我们调用一个函数的时候,当它有参数的时候(除了有out关键字修饰的参数),我们就需要在调用此函数时传入参数,参数的类型必须与函数声明时,声明的参数类型一致,否则函数调用会产生一些意想不到的后果。

函数的参数主要有三种类型,值参数,引用参数和输出参数

方式描述
值参数这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。
引用参数这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。
输出参数这种方式可以返回多个值。

值参数即为声明时的参数类型为值类型或引用类型。引用参数为有关键字ref修饰的参数。参数参数为有关键字out修饰的参数。对于三种参数的引用如下

 class Program
    {
        static void Main(string[] args)
        {
            string Question= "Who Are You?";
            string tmpQ;
            tmpFunctiopnA();//此处报错 必须提供与函数参数所对应的实参
            tmpFunctiopnA(Question);

            tmpFunctiopnB(ref Question);
            tmpFunctiopnB(ref tmpQ);//此处报错 ref函数不能引用未定义参数
            Console.WriteLine(Question);
            
            tmpFunctiopnC(out Question);
            tmpFunctiopnC(out tmpQ);
            Console.WriteLine(Question);

            Console.ReadLine();
        }
        static void tmpFunctiopnA(string name)
        {           

        }
        static void tmpFunctiopnB(ref string name)
        {
            name = "George";
        }
        static void tmpFunctiopnC(out string name)
        {
            name = "John";           
        }
        static void tmpFunctiopnD(ref string name)
        {
           
        }
        static void tmpFunctiopnE(out string name)
        {
        //此处报错,在离开函数之前必须对out修饰的参数赋值
        }
    }

在我们将错误的地方解决后,会得到下面两个结果’’ George"和"John"。
由上面的例子我们可以看出:

  1. 值参数只需在函数调用时传入与之类型相对应的变量即可。
  2. 引用参数传入变量时,必须传入一个拥有初始值的变量,此变量的值可以在函数内部进行改变。
  3. 输出参数传入变量时,可以传入没有初始化的变量值,但是函数内部必须对此参数进行重新赋值。

一般时候我们都会声明无参数或者值参数类型的函数,在需要声明引用参数或输出参数时,我们需要注意二者之间的不同。

函数返回值

与参数在函数定义时的可有可无不同,一个函数是否有参数在定义时必须指明。如下例:

         static string tmpFunctiopnA(string name)
        {
            return name;
        }
          static void tmpFunctiopnA(string name)
        {        
        }

在我们定义函数表达式时,必须对该函数有没有返回值进行描述。如果此函数没有返回值,我们会用void关键词进行标记。如果此函数有返回值,那必须在函数内用return关键字返回一个与之类型一致的值。通过函数自带返回值通常只可以返回一种类型的一个返回值,如果我们需要多个或多种返回值,我们可以通过上面描述的引用参数和输出参数来返回我们需要的值。

类型转换

我们在过去的学习中已经看到过我说过很多次要求类型一致,比如输入参数的类型和参数本身的类型一致,又比如,定义变量时的类型和变量的值得类型一致。那当类型不一致,我们还需要将参数传入,或者给变量赋值该怎么办呢?那就需要类型转换,看下例:

class Program
    {
        static void Main(string[] args)
        {
            int tmpIntA = 0;
            float tmpFloatB = 0.1f;
            string tmpStringC = "1";
            int tmpIntD;
            Console.WriteLine((int)tmpFloatB);//此处用转换符(int)将float类型转换成为int类型
            Console.WriteLine((float)tmpIntA);
          //  Console.WriteLine((int)tmpStringC);//报错无法将string转换成int类型
            int.TryParse(tmpStringC, out tmpIntD);
            Console.WriteLine(tmpIntD);
            tmpFloatB =tmpIntA ;//此处隐式将tmpIntA 的int类型转换成为了float类型
            Console.WriteLine(tmpIntB);
            Console.ReadLine();
        }
            
    }

输出结果如下
在这里插入图片描述
类型转换在我们日常写代码中会经常用到,转换的方式有两种,显式转换和隐式转换。隐式转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。而显示转换是强制的类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。如果有时候我们需要一些类型转换,而这些转换没有系统内置的显示或隐式转换,这时我们就需要一些转换方法,如试着将string转换成为Int的TryPrase函数。与之类似的方法还有很多,请戳 C# 类型转换方法

修饰符

此部分我考虑了好久到底在哪里讲比较合适,但是感觉再不讲,初学者们就会对有些地方感觉迷糊。所以现在这里见讲一下,后面也会再次提及。

访问修饰符

我们平时最常用的修饰符是访问修饰符

关键字访问级别
public同一程序集(DLL或EXE)中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
private只有同一类或结构中的代码可以访问该类型或成员。
protected只有同一类或结构或者此类的派生类中的代码才可以访问该类型或成员。
internal同一程序集中的任何代码都可以访问该类型或成员,但其他程序集的代码不可以。

我们平时声明一个变量时,如果不写访问修饰符,会默认private型变量,那么这个变量只能在当前作用域中起作用,如果声明变量为Public,则该变量在各个位置都能被访问到。函数同样如此。

其他修饰符

abstract
使用abstract修饰的类为抽象类,抽象类只能是其他类的基类,不能与sealed、static一起使用。abstract可以修饰抽象类中的方法或属性,此时,方法或属性不能包含实现,且访问级别不能为私有。抽象类不能被实例化。

sealed
使用sealed修饰的类为密封类,密封类无法被继承,不能和abstract、static一起使用。当sealed用于方法或属性时,必须始终与override一起使用。

static
使用static修饰的类为静态类,静态类所有成员都必须是静态的,不能与abstract、sealed一起使用。static可以修饰方法、字段、属性或事件,始终通过类名而不是实例名称访问静态成员,静态字段只有一个副本。静态类不能被实例化。

const
使用const关键字来声明某个常量字段或常量局部变量,必须在声明常量时赋初值。不能与static一起使用,常量默认是static的,常量字段只有一个副本。

readonly
使用readonly关键字来声明只读字段。只读字段可以在声明或构造函数中初始化,每个类或结构的实例都有一个独立的副本。可以与static一起使用,声明静态只读字段。静态只读字段可以在声明或静态构造函数中初始化,静态常量字段只有一个副本。

virtual
virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。默认情况下,方法是非虚拟的。 不能重写非虚方法。virtual修饰符不能与static、abstract、private或override修饰符一起使用。

override
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用override修饰符。重写的成员必须是virtual、abstract或override的。

其中具体的一些用法,我们会在之后的部分详细的讲到。

今天的整理完成,本次梳理中的动手部分是自己尝试写一下各种类型的类型转换,并且自己尝试写自己用于类型转换的函数,比如自己手动写一个将string转换成为float的函数。下一篇我们讲述C#中的判断条件和循环条件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值