我有一个方法,如果找到它,它应该返回一个对象.
如果找不到,我应该:
这是一个普遍的问题(但我使用的是C#),最好的方法是什么(最佳实践),对于将集合作为返回类型的方法,是否返回null或空集合?
为了避免我可以用Google搜索的所有标准答案,我将提供一个你可以随意攻击的例子.
C#和Java(和太多的人)有很多类型的一些"溢出"的行为,我不都不像(如type.MaxValue + type.SmallestValue == type.MinValue例如: int.MaxValue + 1 == int.MinValue).
但是,看到我的恶性,我会通过扩展这种行为来增加对这种伤害的一些侮辱,让我们说一个Overridden DateTime类型.(我知道DateTime密封在.NET中,但是为了这个例子,我使用的是一种与C#完全相同的伪语言,除了DateTime没有密封的事实).
被覆盖的Add方法:
/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan.
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and
/// continue from DateTime.MinValue.
/// </returns>
public DateTime override Add(TimeSpan …Run Code Online (Sandbox Code Playgroud) [这是最佳实践的结果:函数应该返回null还是空对象?但我想要非常一般.]
在很多传统的(嗯...生产)C++代码,我所看到的,有写的倾向大量的NULL(或类似)的检查,以测试指针.在添加NULL时,许多这些都会在发布周期结束时添加 - 检查可以快速解决由指针取消引用导致的崩溃问题 - 而且没有太多时间进行调查.
为了解决这个问题,我开始编写带有(const)引用参数的代码,而不是传递指针的(更多)常见技术.没有指针,没有检查NULL的愿望(忽略实际具有空引用的角落情况).
在C#中,存在相同的C++"问题":希望检查针对null(ArgumentNullException)的每个未知引用并NullReferenceException通过添加null检查来快速修复s .
在我看来,防止这种情况的一种方法是首先使用空对象(String.Empty,EventArgs.Empty)来避免空对象.另一个是抛出异常而不是返回null.
我刚刚开始学习F#,但看起来在那个环境中有更少的空对象.那么也许你真的不需要有很多null参考文献?
我在这里吠叫错了吗?
对我来说,作为开发人员和用户,我发现空字符串("")无用且引起很多混乱,就像说string == char []
也许计算机需要空字符串,所以我想了解原因.
也可以看看:
我在这里发现问题如果检索方法返回'null'或者当它无法产生返回值时抛出异常?和是否应函数返回null或一个空对象?,但我认为我的情况完全不同.
我正在编写一个由Web服务和客户端组成的应用程序.Web服务负责访问数据并将数据返回给客户端.我设计我的应用程序是这样的:
//网络服务
try
{
DataTable data = GetSomeData(parameter);
return data
}
catch (OopsException ex)
{
//write some log here
return null;
}
Run Code Online (Sandbox Code Playgroud)
//客户:
DataTable data = CallGetSomeData(parameter);
if(data == null)
{
MessageBox.Show("Oops Exception!");
return;
}
Run Code Online (Sandbox Code Playgroud)
好吧,有一个不返回null的规则.我不认为我应该重新抛出异常并让客户端捕获SoapException.你有什么评论?有没有更好的方法来解决这个问题?
谢谢.
我已经阅读了几本书并看过几篇博客,讨论如何返回空集合比返回null更好.我完全理解试图避免检查,但我不明白为什么返回一个空集合比返回null更好.例如:
public class Dog{
private List<String> bone;
public List<String> get(){
return bone;
}
}
Run Code Online (Sandbox Code Playgroud)
VS
public class Dog{
private List<String> bone;
public List<String> get(){
if(bone == null){
return Collections.emptyList();
}
return bone;
}
}
Run Code Online (Sandbox Code Playgroud)
示例一将抛出NullPointerException,示例二将抛出UnsupportedOperation异常,但它们都是非常通用的异常.是什么让一个人比另一个好或坏?
另外一个选择是做这样的事情:
public class Dog{
private List<String> bone;
public List<String> get(){
if(bone == null){
return new ArrayList<String>();
}
return bone;
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是,您正在为其他人可能必须维护的代码添加意外行为.
我真的在寻找解决这种困境的方法.博客上的许多人倾向于只是说没有详细解释为什么会更好.如果返回一个不可变列表是最好的做法,我可以这样做,但我想了解为什么它更好.
我读到的每个地方都不断重新思考"永远不会返回空值",但如果在无法找到值的情况下,如果不为null,我应该返回什么?
采取以下方法
List<Customer> GetCustomerListByRoleID(Guid RoleID) {}
Run Code Online (Sandbox Code Playgroud)
在这种情况下(并且在大多数复数方法中)List<Customer>如果我们找不到我们的价值并且我们很好,那么它很容易简单地返回空.
但是在类似方法的情况下
Customer GetCustomerByID(Guid CustomerID) {}
Run Code Online (Sandbox Code Playgroud)
你没有返回空数组的奢侈.事实上你所能做的只是返回一个New Customer();但是你有一个潜在的未初始化对象(你仍然需要检查)或null.
那么在单数方法中返回null的推荐替代方法是什么?
我有一个类型实体列表,它通过Entity Framework从DB获取值.如果将null结果集作为null或空列表返回,如下所示:
private List<Order> _myOrders;
public List<Order> myOrder
{
get
{
return this._myOrders ?? new List<Order>();
}
set
{
this._myOrders = value;
}
}
Run Code Online (Sandbox Code Playgroud)
任何处理代码都会对表使用count()而不是"!= null"测试?什么被认为是更好的做法.我怀疑应该尝试管理属性中的空值,否则就会在整个地方编写空测试代码.
思考?
谢谢.
c# ×5
null ×4
exception ×3
collections ×2
java ×2
return-value ×2
.net ×1
c++ ×1
immutability ×1
linq ×1