C#知识点(3)访问修饰符、方法参数关键字“params、ref、in、out”

1. 访问修饰符

访问修饰符介绍

  1. 访问修饰符种类:public、protected、internal 和 private。
  2. 使用访问修饰符指定以下六个可访问性级别:
声明的可访问性含义
public访问不受限制。
protected访问限于包含类或派生自包含类的类型(本类成员和继承的子类)。
internal访问限于当前程序集。
protected internal访问限于当前程序集或派生自包含类的类型。
private访问限于包含类(本类成员)。
private protected访问限于包含类或当前程序集中派生自包含类的类型。 自 C# 7.2 之后可用。
  1. 注意:除使用 protected internal 或private protected 组合的情况外,一个成员或类型仅允许一个访问修饰符。

方法、类等的默认访问修饰符

成员默认成员可访问类允许成员的声明可访问性
enumpublic
classprivate六个可访问性级别都可以
interfacepublic
structprivatepublic、internal、private

嵌套类型:可访问域不能超出包含类型的可访问域。

2. 方法参数关键字

params

  1. 作用:指定采用参数是数目可变的一维数组,也是引用传递。
  2. 限制:参数必须是一维数组。方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。params也不能和其它方法参数关键字共用。
  3. params和普通数组传参的区别:params可以不用创建数组,直接传入一系列参数(下面有演示)。这也是为什么params关键字之后不允许有其它的参数,因为输入是不定长的参数。
  4. 演示:
namespace Blog1
{
    class Program
    {
        //int sum不能放在params定义的参数后面
        public static int Addtion(int sum,params int[] intparams)
        {
            for(int i = 0; i < intparams.Length; i++)
            {
                sum += intparams[i];
            }
            return sum;
        }
        static void Main(string[] args)
        {
            int[] num = { 1, 2, 3 };
            int sum = 100;
            sum=Addtion(sum, num);
            Console.WriteLine(sum);
            sum=Addtion(100,1,2,3);//接传入一系列参数
            Console.WriteLine(sum);
            Console.ReadKey();
        }
    }
}

ref

  1. 作用:参数由引用传递,可能由调用方法读取或写入,可读可写。参数由引用传递意思就是它让形参成为实参的别名,形参改变实参也改变,实参改变形参也改变。使值类型的变量做方法参数时也可以传引用。
  2. 演示:
namespace Blog1
{
    class Program
    {
        public static void Addtion(ref string str)
        {
            str = "no";
        }
        static void Main(string[] args)
        {
            string str = "yes";
            Console.WriteLine(str);
            //传参时候要带上ref,in、out都一样
            Addtion(ref str);
            Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}

in

  1. 作用:参数由引用传递,但只由调用方法读取,只读引用。

out

  1. 作用:指定此参数由引用传递,由调用方法写入,只写引用。
  2. 限制:只出不进,将参数传进去时值是无效的,out会把参数清空,无法将一个值从 out传递进去。在函数离开前以及在函数使用out修饰的参数之前,要对该参数初始化操作才可以。

ref、in、out的注意点

  1. 函数重载方面:in、ref 和 out 关键字不在用于决定重载的方法签名中区分。所以两个函数有相同数量类型的参数和返回值,只有in、ref、out关键字的区别是不能区分两个函数
  2. 传入前,in、ref需要先经过初始化,out不用。但在函数离开前以及在函数使用out修饰的参数之前,要对该参数初始化操作才可以,只是修改参数里面的数是不行的。
namespace Blog1
{
    public class Hellow
    {
        public string str = "hellow";
    }
    class Program
    {
        public static void Test(out Hellow str)
        {
            str.str = "yes";//只是修改参数里面的成员值,会报两个错
            //“CS0177	控制离开当前方法之前必须对 out 参数“str”赋值”
            //“CS0269	使用了未赋值的 out 参数“str””	
            //要给str赋值才行才能使用和离开,例如str=new Hellow();
            Console.WriteLine(str);
        }
        static void Main(string[] args)
        {
            Hellow h=new Hellow();
            Test(out h);
            Console.ReadKey();
        }
    }
}
  1. in、ref、out都是引用传递。
  2. in、ref、out不允许用在:
  • 异步方法,通过使用 async 修饰符定义。
  • 迭代器方法,包括 yield return 或 yield break 语句。
  1. 对于扩展方法方面:
  • 不能对扩展方法的第一个参数使用 out 关键字。
  • 当参数不是结构或是不被约束为结构的泛型类型时,不能对扩展方法的第一个参数使用 ref 关键字。
  • 除非第一个参数是结构,否则不能使用 in 关键字。 即使约束为结构,也不能对任何泛型类型使用 in 关键字。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值