C# 如何避免异常函数的复制粘贴?
我在几个不同的类别C1、D2、F34中具有以下功能: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
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”方法周围添加任何静态类……这不是什么大问题。我的意图是展示一个想法。希望,这个想法足够清楚