Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

C#3 分部方法,简单标记一下

凯帝农垦 2019-01-27 01:01:00 阅读数:172 评论数:0 点赞数:0 收藏数:0

    如果我问你,如果一个普通的类实现了一个接口方法,但是这个类的实例却访问不到这个接口的方法,这种情况你遇到过吗?有时候,你可能在使用分部方法时就会发现这么一个现象。

    C#3 中出现了 “分部方法” ,工作了好几年一直没用过,可能不咋实用,也有可能是工作中没有遇到这种场景,分部类倒是用了不少。最近看了一下,内容简单,标记一下。

    我们 分部方法 和分部类有点类似的是 也是使用的关键字 partial ,不过不同的是 部分方法 不能有访问修饰符 (像public) 或者 virtual ,abstract,override,new,sealed,extern  。

     而分部类是没有这个限制。那么你应该会想这个方法,是会像接口中定义的没法带修饰符方法一样 天生是公用的,  还是像普通类中 是私有的呢,我迫不及待的做了个代码,结局倾向了后者。

//文件1中

 public partial class People
{
public People(string arg)
{
Speak($"我被构造了,带着{arg}");
}
partial void Speak(string paramStr);
}

 

//文件2中

 public partial class People
{
partial void Speak(string paramStr)
{
Console.WriteLine($"收到参数{params}");
}
}

   测试

class Test
{
static void Main()
{
People p= new People("2019到了");
//p.Speaks("Hello"); 访问不到 
 Console.ReadKey();
}
}

 

      上面是我们的使用例子,部分方法 限制了我们的方法不能有返回值,只能是void的方法,且不能获取out参数,它必须是私有的,可以是静态的或者泛型。

      文件1中   分部方法 的申明和抽象方法相同,只提供了partial修饰符的签名而没有实现,以分号结尾。我们分析文件1中的IL代码,发现构造函数中没有任何痕迹。

      接下来,我们看下如果定义接口,然后实现的时候使用分部方法呢。

 public interface IPeople
{
void Speaks();
}

//文件1

 public partial class People:IPeople
{
partial void Speaks();
}

//文件2

 public partial class People : IPeople //接口可写可不写
{
void IPeople.Speaks()
{
Console.WriteLine("哎呀,2019都来了");
}
}

       我们发现 实现接口需要显式实现。然后我们调用看看:

 class Test
{
static void Main()
{ 
People p2 = new People();
// p2.Speaks(); 访问不到
}

     p2访问不到实现的接口方法。当然,如果再定义一个子类,子类的实例也是访问不到的。那么怎么才能访问到呢,你一定会这么写:

 class Test
{
static void Main()
{
IPeople p1 = new People();
p1.Speaks(); // 完全ok 
}

      所以你总的感觉下来,这个东西限制还是蛮大的。这个特性特别适用那些自动生成代码和手动写代码一起交互场景。概况的说,C#3的分部方法让生成代码可以和手写代码以一种丰富的方式进行交互,而不会产生任何性能上的损失,可以说是C#2分部类一种自然的延续。

 

版权声明
本文为[凯帝农垦]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/wwkk/p/10325463.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领