RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 822305
Accepted
Vadim Prokopchuk
Vadim Prokopchuk
Asked:2020-05-03 01:47:22 +0000 UTC2020-05-03 01:47:22 +0000 UTC 2020-05-03 01:47:22 +0000 UTC

C# 中的部分方法

  • 772

部分方法有什么实际用途?

例如,

partial class A
{
    partial void OnSomethingHappened(string s);
}

partial class A
{
    partial void OnSomethingHappened(String s)
    {
        Console.WriteLine("Something happened: {0}", s);
    }
}

部分方法 C#

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Grundy
    2020-05-03T03:13:08Z2020-05-03T03:13:08Z

    当有部分类时,方法签名可以定义在一个文件中,实现在另一个文件中。例如

    一个文件可以包含:

    partial class Foo
    {
        partial void Bar();  // без реализации
    
        public void DoSomething()
        {
            // что-то делаем...
            Bar();    // Это может быть удалено, если `Bar` нигде не будет реализован
            // делаем что-от еще...
        }
    }
    

    在另一个文件中:

    partial class Foo
    {
        partial void Bar()
        {
            // что-то делаем...
        }
    }
    

    这使您可以调用Bar第一个文件,而不必担心它是否在某个地方实现。如果Bar它从未在任何地方实现,那么它的所有调用都将在编译时被删除(从这里):

    部分方法允许类的一部分的实现者定义类似事件的方法。实现第二部分的类决定是否实现该方法。如果该方法尚未实现,则编译器将删除该方法签名及其所有调用。方法调用,包括可能因评估调用中的参数而产生的任何结果,将在运行时被忽略。因此,分部类中的任何代码都可以自由使用分部方法,即使它没有实现。因此,如果在没有实现的情况下调用该方法,则不会出现编译时或运行时错误。


    与partial classes一样,主要用途是处理生成的代码:

    在自定义生成的代码时,部分方法特别有用。它们允许您保留方法的名称和签名,以便生成的代码可以调用该方法,但开发人员可以决定是否实现该方法。与分部类一样,分部方法允许您在运行时将生成的代码和开发人员编写的代码组合在一起。

    因此可以生成调用部分方法的代码(在生成的代码中没有实现定义),并且由开发人员决定他/她是否想要/需要扩展部分类并实现部分方法。

    @Matt Burland 答案的翻译

    • 5
  2. Best Answer
    user177221
    2020-05-03T16:03:41Z2020-05-03T16:03:41Z

    如果问题是关于实际应用的,那么部分方法只能返回 void 的事实非常有限。那些。系统“架构师声明方法,开发人员实施”不能建立在部分之上。

    主要有两个用途:

    1. 简化处理程序的连接。例如,在 ASP.NET 的 global.asax 中,声明一个具有所需名称的方法就足够了:

      protected void Application_Start(object sender, EventArgs e)
      

      它将自动附加到 Start 事件处理程序。

      如果您尝试在代码生成器中实现类似的机制,将所有可能的“处理程序”声明为部分方法就足够了,并在适当的位置调用它们。如果编译器找到处理程序的实现,它将离开调用。如果没有,那就剪掉它。

    2. 调试用于编写单元测试的调用,尤其是用于抛出异常的调用。例如,您需要编写一个测试来处理 Redis 连接错误,特别是针对套接字错误。仅仅为了测试抛出异常而将所有套接字工作封装在一个包装类中是昂贵且耗时的。您可以在实时代码中进行现场调试:

      internal sealed partial class PhysicalConnection : IDisposable, ISocketCallback
      {
           partial void OnDebugAbort();
          //... 
      
          SocketMode ISocketCallback.Connected(Stream stream, TextWriter log)
          {
              //... 
              // disallow connection in some cases
              OnDebugAbort();        
              //... 
          }
      }
      

      并编写一个仅存在于调试版本中的实现:

      #if DEBUG
      internal partial class PhysicalConnection
      {
         partial void OnDebugAbort()
         {
              if (!Multiplexer.AllowConnect)
              {
                  throw new          
                RedisConnectionException(ConnectionFailureType.InternalFailure, 
                 "debugging");
              }
          }
      #endif 
      
    • 3
  3. vmchar
    2020-05-03T02:05:24Z2020-05-03T02:05:24Z

    当您使用一些外部库或框架并希望能够扩展在库(或框架)中实现的类的功能同时保持库的源代码不变(例如,在这个库的源代码作为 git 子模块被拉入你的项目,你不想为你的项目保留一个单独的分支)。为此,您可以在项目中创建一个单独的文件,其中包含现有类的部分声明,并向其中添加您需要的功能。

    此外,如果您自己正在开发围绕单个类构建的任何库(以单例方式),您可能希望将类的功能物理分离为几个部分,以便于导航和编辑,而不是将其拆分为 2不同的子类(相当退化的例子,但有权存在)。

    部分方法可以方便地装饰对象,可选地添加功能,例如验证某些字段,或添加前置或后置操作,这在使用第三方库或框架中的类时也很方便。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5