C# 如何避免异常函数的复制粘贴?

C# 如何避免异常函数的复制粘贴?,c#,.net,C#,.net,我在几个不同的类别C1、D2、F34中具有以下功能: class C1 { void SomeFunc { Statement1(); Obj = GetObj(); Statement2(Obj); } IMyObj Obj{get;private set;} } public static class MyObjExt { public static void Statement2(this IMyOb

我在几个不同的类别C1、D2、F34中具有以下功能:

class C1
{
    void SomeFunc
    {
        Statement1();
        Obj = GetObj();
        Statement2(Obj);
    }
    IMyObj Obj{get;private set;}
}

public static class MyObjExt
{
    public static void Statement2(this IMyObj obj)
    {
        ... do validation of 'obj';
        ... throw exception if object state is wrong
    }
}
类C1、D2、F34不是同一层次结构的成员

所以我想避免复制粘贴它们

我可以这样做:

static MyObj MyFunc()
{
  Statement1();
  IMyObj obj = GetObj();
  Statement2(obj);

  return obj;
}
class C1
{
  void SomeFunc
  {
      Obj = MyFunc();
  }
  IMyObj Obj{get;private set;}
}
但如果“Statement2”函数抛出异常,obj成员将保持未初始化状态


如何避免复制粘贴?

我有一个更复杂的解决方案:

class Extender
{
    static IMyObj MyFunc(out IMyObj obj)
    {
        Statement1();
        obj = GetObj();
        Statement2(obj);
    }
}

class C1
{
  void SomeFunc
  {
    IMyObj obj=null;
    try
    {
         MyFunc(out obj);
    }
    finally
    {
        Obj = obj;
    }
  }
  IMyObj Obj{get;private set;}
}
但我不确定它是否会也必须起作用。这是好方法还是坏方法

如果你认为它是好的-请投票,如果没有-请指出“为什么”

非常感谢


编辑:修改后添加了“SomeFunc”实现。

您希望发生什么?我希望始终初始化“Obj”属性。特别是,若在“语句2”中抛出异常,我不明白你们想做什么。看起来
Statement1()
Statement2()
Obj
的初始化无关-为什么它们采用相同的方法?Statement2()对新实例化的Obj执行什么操作?有没有可能把你正在做的事情分成多个电话?这是令人困惑的因素。语句2使用Obj。实际上,它验证对象状态(我将更新问题),我认为这不是一个好的解决方案。为什么要保证C1.Obj被初始化,即使对象处于无效状态?这是一项服务。我想记录服务方法执行期间发生的任何错误。我使用“复合键”从数据库中提取这个对象,这个对象将具有实心(有效)主键。我想在日志表中使用此主键。实际上,我可以使用一个单独的对象来存储密钥,但对于这个例子来说,这并不重要(在抛出潜在异常之前,我需要存储一些信息。这不会编译。方法只能存在于C#中的一个类中。只需在这些“MyFunc”方法周围添加任何静态类……这不是什么大问题。我的意图是展示一个想法。希望,这个想法足够清楚