1. 访问修饰符
访问修饰符介绍
- 访问修饰符种类:public、protected、internal 和 private。
- 使用访问修饰符指定以下六个可访问性级别:
声明的可访问性 | 含义 |
---|
public | 访问不受限制。 |
protected | 访问限于包含类或派生自包含类的类型(本类成员和继承的子类)。 |
internal | 访问限于当前程序集。 |
protected internal | 访问限于当前程序集或派生自包含类的类型。 |
private | 访问限于包含类(本类成员)。 |
private protected | 访问限于包含类或当前程序集中派生自包含类的类型。 自 C# 7.2 之后可用。 |
- 注意:除使用 protected internal 或private protected 组合的情况外,一个成员或类型仅允许一个访问修饰符。
方法、类等的默认访问修饰符
成员 | 默认成员可访问类 | 允许成员的声明可访问性 |
---|
enum | public | 无 |
class | private | 六个可访问性级别都可以 |
interface | public | 无 |
struct | private | public、internal、private |
嵌套类型:可访问域不能超出包含类型的可访问域。
2. 方法参数关键字
params
- 作用:指定采用参数是数目可变的一维数组,也是引用传递。
- 限制:参数必须是一维数组。方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。params也不能和其它方法参数关键字共用。
- params和普通数组传参的区别:params可以不用创建数组,直接传入一系列参数(下面有演示)。这也是为什么params关键字之后不允许有其它的参数,因为输入是不定长的参数。
- 演示:
namespace Blog1
{
class Program
{
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
- 作用:参数由引用传递,可能由调用方法读取或写入,可读可写。参数由引用传递意思就是它让形参成为实参的别名,形参改变实参也改变,实参改变形参也改变。使值类型的变量做方法参数时也可以传引用。
- 演示:
namespace Blog1
{
class Program
{
public static void Addtion(ref string str)
{
str = "no";
}
static void Main(string[] args)
{
string str = "yes";
Console.WriteLine(str);
Addtion(ref str);
Console.WriteLine(str);
Console.ReadKey();
}
}
}
in
- 作用:参数由引用传递,但只由调用方法读取,只读引用。
out
- 作用:指定此参数由引用传递,由调用方法写入,只写引用。
- 限制:只出不进,将参数传进去时值是无效的,out会把参数清空,无法将一个值从 out传递进去。在函数离开前以及在函数使用out修饰的参数之前,要对该参数初始化操作才可以。
ref、in、out的注意点
- 函数重载方面:in、ref 和 out 关键字不在用于决定重载的方法签名中区分。所以两个函数有相同数量类型的参数和返回值,只有in、ref、out关键字的区别是不能区分两个函数。
- 传入前,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";
Console.WriteLine(str);
}
static void Main(string[] args)
{
Hellow h=new Hellow();
Test(out h);
Console.ReadKey();
}
}
}
- in、ref、out都是引用传递。
- in、ref、out不允许用在:
- 异步方法,通过使用 async 修饰符定义。
- 迭代器方法,包括 yield return 或 yield break 语句。
- 对于扩展方法方面:
- 不能对扩展方法的第一个参数使用 out 关键字。
- 当参数不是结构或是不被约束为结构的泛型类型时,不能对扩展方法的第一个参数使用 ref 关键字。
- 除非第一个参数是结构,否则不能使用 in 关键字。 即使约束为结构,也不能对任何泛型类型使用 in 关键字。