C# 类 方法 参数

类成员

  • 字段和方法是最重要的成员类型,字段是数据成员,方法是函数成员
  • C#在类型的外部不能声明全局变量,所有的字段都属于类型,而且必须在类型申明内部申明
  • 如果对字段没有进行初始化赋值操作,一般来说值默认是0,bool类型是false,引用类型是null
  • C#中没有全局函数,C#的方法必须包含返回类型

为数据分配内存

  • 声明类类型的变量是用来保存引用的,不需要保存实际数据,要为实际诗句分配内存,需要使用new关键字

实例成员

  • 类的每一个实例都是不同的实体,一般不同于同一类的其他实例成员,因为这些数据都和类的实例相关,所以称之为类的实例成员
  • 不是实例的成员则称之为静态成员
  • 因为实例字段时类的成员,所以字段都存储在堆里,无论他们时引用类型还是值类型

访问修饰符

  • 在类的内部,任何函数成员都可以使用成员的名称访问类中任意的其他成员
  • 私有访问时默认的访问级别,如果不带访问修饰符则默认为私有访问,亦可以使用private显示的修饰,但实际上两者都是相同的

方法

  • 方法体是一个块,大概可以包含一下内容:局部变量、控制流结构、方法调用、内嵌的块级、其他方法称之为局部函数

局部变量

  • 字段通常保存和对象状态性质相关的数据,而创建局部变量经常用于保存局部的的或临时计算的数据
  • 局部变量的生命周期仅限于创建它的块和内嵌的块
  • 局部变量无法隐式初始化,必须声明它的值

类型推断

  • int age = 15; 该语句编译器可以推断出15的类型是int类型,所以为了减少这种冗余可以使用var关键字进行类型推断
  • var并不是特殊变量,只是语法上的速记。表示可以从右边推断出的任意类型
  • var只能用于局部变量,不能用于字段且一旦编译器推断出变量的类型,他就是固定的且不能改变的
  • var仅仅是从右边推断出来的速记,并不改变C#强类型语言的性质
  • 一般来说,为了程序的可读性和后期的维护,一般不建议使用类型推断
    class Program
    {
        static void Main(string[] args)
        {
            var age = 18;
            var name = "it.yuan";
            Console.WriteLine(age+"\n"+name);
        }
    }

局部常量

  • 值一旦被确定就不能被改变,必须申明在块的内部
  • 他在申明时必须初始化,且一旦申明就不能改变
  • 局部常量使用const进行修饰,const时核心申明的一部分,必修放到类型的前面

局部函数

  • 从C#7.0开始,方法块内的代码可以调用另外一个方法
 class Program
    {
        public void MethonWithLocalFunction() 
        {
            int MyLocalFunciton(int value) 
            {
                return value * 5;
            }
            Console.WriteLine(MyLocalFunciton(5));

        }
        static void Main(string[] args)
        {
            Program p = new Program();
            p.MethonWithLocalFunction();
        }
    }

值参数

  • 值参数的实参不一定时变量,也可以任何能计算出相应数据类型的表达式
float f1 =  func((k + j) / 3)
  • 用作实参之前,变量必须被赋值,除非是输出参数
  • 系统在栈上为形参分配内存

引用参数

  • 使用引用参数时,必须在方法的申明和调用中都使用ref修饰符
  • 引用类型变量可以赋值为一个引用或者null
  • 系统不会在栈上为形参分配内存
  • 形参的参数名称将做为实参变量的别名,指向相同的内存位置
  • 方法在执行过程中对形参做的任何改变在方法完成后依然可见
  • 方法的申明可调用上都需要使用ref关键字
    class MyClass
    {
        public int val = 20;
    }

    class Program
    {
        static void MyMethod(ref MyClass f1, ref int f2)
        {
            f1.val = f1.val + 5;
            f2 = f2 + 5;
            Console.WriteLine("f1.val: {0}   f2: {1}", f1.val, f2);
        }
      
        static void Main(string[] args)
        {
            MyClass a1 = new MyClass();
            int a2 = 10;
            MyMethod(ref a1, ref a2);
            // 不使用ref,a2将会输出10
            Console.WriteLine("a1.val: {0}   a2: {1}", a1.val, a2);
        }
    }
f1.val: 25   f2: 15
a1.val: 25   a2: 15
请按任意键继续. .

输出参数

  • 输出参数用于从方法体内部传出到调用代码,他们的行为与引用参数类似
  • 必须在申明和调用中使用out修饰符
  • 和引用参数类似,实参必须是变量而不能是其他类型的表达式,因为方法需要内存位置来保存返回值
  • 显然在方法内部对形参做的任何改变在方法执行完成之后都是可见的
  • 在方法内部,给输出参数赋值以后才能读取它,这意味着它与参数的初始值是无关的,所以没有必要在调用之前进行赋值操作
public void Add2(out int outValue)
{
	int var1 = outValue + 2;//出错,在方法赋值之前无法读取输出变量
}

ref局部变量和ref返回

  • ref返回功能:允许你将一个引用发送给方法外,然后在调用上下文内使用这个引用
  • ref局部变量:允许一个变量时另外一个变量的别名
int x = 2;
// 为变量x建立一个别名为y的变量,他们的值会互相影响
ref int y = ref x;
  • 别名功能并非ref局部变量的主要功能,实际上它经常和ref返回功能一起使用
  • 他需要分别在方法返回类型之前,和return关键字之后被返回对象的变量名之前使用ref关键字
  • 不能将空返回值申明为ref方法
  • ref局部变量只能被被赋值一次,一旦被初始化就不能指向不同的存储位置了
    class Simple
    {
        private int val = 20;

        public ref int RefToValue() 
        {
            return ref val;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Simple s = new Simple();
            ref int outValue = ref s.RefToValue();
            // 此时因为ref的使用,当outValue改变时,s中的val值也会跟着改变
            outValue = 10;
        }
    }

方法重载

  • 一个类中可以有多个同名方法,这叫做方法的重载,使用相同名称的方法必须有一个和其他方法不同的签名
  • 方法签名:方法名称、参数数目、数据类型和顺序、参数修饰符

命名参数

  • 只要显示的指定参数的名字,就可以任意顺序在方法调用中列出实参
  • 使用命名参数可以显式的赋值,当然也可以不全部显示赋值,只交换其中几个也是完全没问题的
    class Simple
    {
        private int val = 20;

        public  int Calc(int a, int b, int c) 
        {
            return  a + b + c;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Simple s = new Simple();
            // 形参:实参
            int result = s.Calc(b: 4, c: 2, a: 3);
            Console.WriteLine(result);
        }
    }

可选参数

  • 顾名思义,该参数只需要提供默认值,在调用的时候并非是必要传递的
  • 可选参数只能是值参数类型
  • 只有默认值是null的时候,引用类型才能做为可选参数
  • 参数的声明顺序为:必填参数,可选参数,params参数
  • 可选参数是从最后开始省略的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值