在C#里冒号的使用主要有三种情况:
文章目录
##继承
这是C#里经常会用到的情况,比如一个类(接口)继承自一个类(或实现了某个接口)
public class A :B
{
public A()
{
dosomething();
}
}
##global::
当你在开发的时候写了一个System命名空间,里面包含Console这个类,也实现了WriteLine()这个方法
namespace System
{
public class Console
{
public static WriteLine(object obj)
{
dosomething();
}
}
}
而这个与基础类库的System.Console.WriteLine()方法重名了,在使用时,编译器不知道要调用谁,这个时候就要用到global::了
public void foo(string str)
{
//使用基础类库的WriteLine()方法
global::System.Console.WriteLine(str);
//使用自己写的WriteLine()方法
System.Console.WriteLine(str);
}
##命名实参
在MSDN是这么描述命名实参的:
比如现在有这么几个重载的方法:
public static void func()
{implements};
public static void func(string a)
{implements};
public static void func(string a,int b)
{implements};
public static void func(string a,int b,bool c)
{implements};
...
这时存在一个问题,当参数很多时,参数顺序就很容易弄乱,这时就可以使用命名实参。有了命名实参,就不再需要记住或查找形参在所调用方法的形参列表中的顺序。 可以按形参名称指定每个实参的形参。
//正常调用func(string a.int b,bool c)
func("abc",10,true);
//使用命名实参
func(b:10,c:true;a:"abc");
这里需要注意的是命名实参可以放在位置实参后面,但位置实参不能放在命名实参后面
func(a:"abc",10);//编译错误
func("abc",b:10);//正确
命名实参还会用在可选实参上:
public static void foo(int i,string str="abc",bool b=true)
{
implements;
}
foo(0);//正确,默认值str="abc",b=true
foo(0,"hello");//正确,str="hello",b=true
foo(0,,false);//错误,实参列表中不支持使用逗号分隔的间隔
foo(0,b=false);//使用命名实参跳过第二个参数