返回该方法接受的同一个对象有什么问题吗?

时间:2011-10-13 14:24:41

标签: c# oop

我有一个名为 SubmitRequest 的方法,它接受一个请求对象。它会填充一些其他值,例如DB生成的序列ID和提交日期。然后返回相同的对象。将它作为VOID方法保留是否更好?

Request request = JsonConvert.DeserializeObject<Request >(jsonFormData);

RequestManager frMan = new RequestManager();
//frMan.SubmitRequest updates the request object by updating some of its properties.
request = frMan.SubmitRequest(request);

return request;

在请求被修改时,void仍然有效:

frMan.SubmitRequest(request);

但这两种方式有什么优点或缺点吗?

10 个答案:

答案 0 :(得分:6)

以这种方式写作是没有害处的。事实上,它是fluent interface的基础。

答案 1 :(得分:2)

我想说这里重要的是不要让你的代码混淆。

我会返回相同的对象......

public Request SubmitRequest(Request request)

或使用ref参数来表明您的意图...

public void SubmitRequest(ref Request request)

或者我猜你可以完全记录你的方法,这样就很明确了......

/// <summary>
/// This function will modify your request data!
/// </summary>
/// <param name="request">The request data to be submitted</param>
public void SubmitRequest(Request request)

答案 2 :(得分:1)

回到request的作业表明SubmitRequest可以返回不同的内容,比如说,它会返回一个与提交的请求有某种关联的新请求。

通常,您看到“返回对象”模式的情况是return this以允许方法链接。

var result = request.SubmitTo(frMan).WaitForResult().GetResult();

答案 3 :(得分:1)

IMO,你需要考虑一下这里发生了什么。

只要查看代码,我就会假设这就是发生的事情:

1)frMan提交传入的请求 2)frMan返回一个新请求

这不是您在问题文本中描述的步骤。

由于你正在操作Request对象,然后(可能是稍后用它做了什么),我会将请求对象传递给方法BY REFERENCE并返回void。这样我知道我只处理一个Request对象,而且它是同一个。另外,我将提供“SubmitRequest”,其中包含一个更逻辑定义的名称,该名称描述了您对请求对象所做的操作。

答案 4 :(得分:1)

我认为这很像构建器模式的一部分(例如,请参阅StringBuilder.Append)。但是:

  • 我不太清楚在这种情况下这是一个好主意。
  • 您应该明确说明这正是该方法的行为方式,并且它永远不会返回不同的引用。

答案 5 :(得分:0)

如果你不需要对修改过的对象做任何事情,那么我就不会在方法调用中返回它。

在Command / Query范例中考虑这一点,SubmitRequest看起来更像是一个命令,而不是一个查询,在这种情况下,返回一个值是不合理的。

答案 6 :(得分:0)

最好将其作为void方法。

当某些内容发生变化时,返回一个对象的想法是如此,但如果没有任何变化。然后数据没有被操纵,因此没有使用返回

的意义

例如:

Object bar = new Object();

// this doesn't do anything. (it wont change the local scope of the object value)
foo(bar); // can be same as void.

//changes the value, but the method returns the same object... whats the point?
bar = foo(bar);

public Object foo(object bar)
{
return bar;    
}

虽然从理论上讲,它不会造成任何伤害。

答案 7 :(得分:0)

该方法的调用者无法保证您返回的实例与它们提供的实例相同。当您返回void时,您明确指出调用者可以确定他们在调用完成后正在处理同一个实例。

答案 8 :(得分:0)

以下列方式返回对象:

private SomeObject DoSomeStuff(SomeObject item)
{
  // perform work on item and change values

  return item;
}

而不是

private SomeObject DoSomeStuff( ref SomeObject item)
{
  //perform work on item
}

根据我的理解,您将会产生轻微的性能损失,因为将创建并返回类型SomeObject的新对象,让垃圾收集器整理原始对象。

如前所述,如果您要执行任何实例检查,那么这也会失败。

答案 9 :(得分:0)

如果要点

frMan.SubmitRequest(request);

是更新Request参数,那么这不应该是Request对象的属性而不是RequesManager的属性吗?像

这样的东西
request.Submit();