C# 检查有效/存在值时的Nullable vs.Out参数
我有两个问题,我想得到一些帮助 我的客户端代码需要访问随时间变化的变量/值,事实上,它是在检索时计算的,并且在运行时通过许多方法多次检索,但是,它的计算并不总是可能的,因为在这种情况下,对它的要求并不总是存在,返回一个false或null,客户端将对此进行检查以决定是否继续。现在,我有两种方法,第一种,A,是我的经典方法,B不过,对我来说也不错 A)我有一个out参数的方法,类似于某些C#库上的TryParse方法:C# 检查有效/存在值时的Nullable vs.Out参数,c#,unity3d,c#-4.0,nullable,out,C#,Unity3d,C# 4.0,Nullable,Out,我有两个问题,我想得到一些帮助 我的客户端代码需要访问随时间变化的变量/值,事实上,它是在检索时计算的,并且在运行时通过许多方法多次检索,但是,它的计算并不总是可能的,因为在这种情况下,对它的要求并不总是存在,返回一个false或null,客户端将对此进行检查以决定是否继续。现在,我有两种方法,第一种,A,是我的经典方法,B不过,对我来说也不错 A)我有一个out参数的方法,类似于某些C#库上的TryParse方法: public bool GetLeadingTrailSegment(out
public bool GetLeadingTrailSegment(out Vector3 lastTrailSegment)
{
if (_line.positionCount > 1)
{
lastTrailSegment = lead - _line.GetPosition(_line.positionCount - 2);
return true;
}
lastTrailSegment = Vector3.zero;
return false;
}
B)我有一个可为null的属性,它尝试执行与上述代码相同的工作:
public Vector3? leadingTrailSegment
{
get
{
if (_line.positionCount > 1)
{
return lead - _line.GetPosition(_line.positionCount - 2);
}
return null;
}
}
客户端代码如下所示: A)这里bool告诉客户端代码该值是否安全(有用?)使用 B)在这里,可空值的HasValue属性为false的事实告诉客户端它是否安全:
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
Vector3? leadingTrailSegment = pointer.leadingTrailSegment;
if (leadingTrailSegment.HasValue)
{
return !midline.ParallelTo(leadingTrailSegment.Value);
}
return true;
}
第一个问题:在这两种方法中,哪一种是最好的,或者它们之间的优缺点是什么 第二个问题:我曾经将客户B方法写为:
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
if (pointer.leadingTrailSegment.HasValue)
{
return !midline.ParallelTo(pointer.leadingTrailSegment.Value);
}
return true;
}
这是错误的,对吗?因为第二次调用可能更改了nullable的Value属性
我最喜欢out-parameter方法,可以在if子句中使用结果,甚至可以在其他版本的C#中内联声明变量,但我真的很想给nullables一个机会,让它们在这样的情况下有用(不仅仅是在我查找未赋值的值时,我在这些情况下使用它们)。我希望有人能就此发表意见
谢谢。我更喜欢返回null的调用,而不是使用输出参数。输出参数是一种容易产生“副作用”的代码结构,我个人非常不喜欢这种结构。这意味着调用代码在使用之前必须定义一个变量,并且它引入了一些弱点,如果您在调用中意外地输入了错误的变量,那么很容易导致错误。它还阻止您在带有null条件运算符和null合并运算符的调用链中使用代码。您不能执行类似于
var v=GetLeadingRailSegment()的操作??新向量3()代码>
第二个有趣的问题是使用可为null的。如果Vector3类型是值类型,那么这很好,也很有意义。如果它是一个引用类型(除了.NET中的整型类型和结构之外,几乎所有的东西),就不需要它了。只需返回null
和如果(变量!=null){…}
。返回布尔值的情况通常是当返回值发生冲突时。例如,如果null本身作为有效值返回,您需要一种方法来区分有效null或无效响应。这里似乎不是这样。我更喜欢返回null的调用,而不是使用输出参数。输出参数是一种容易产生“副作用”的代码结构,我个人非常不喜欢这种结构。这意味着调用代码在使用之前必须定义一个变量,并且它引入了一些弱点,如果您在调用中意外地输入了错误的变量,那么很容易导致错误。它还阻止您在带有null条件运算符和null合并运算符的调用链中使用代码。您不能执行类似于var v=GetLeadingRailSegment()的操作??新向量3()代码>
第二个有趣的问题是使用可为null的。如果Vector3类型是值类型,那么这很好,也很有意义。如果它是一个引用类型(除了.NET中的整型类型和结构之外,几乎所有的东西),就不需要它了。只需返回null
和如果(变量!=null){…}
。返回布尔值的情况通常是当返回值发生冲突时。例如,如果null本身作为有效值返回,您需要一种方法来区分有效null或无效响应。这里似乎不是这样。我的两分钱:)
tldr:
我宁愿问你为什么想要一个返回布尔值的方法,但是这个名称暗示了另一件事。
如果我有player.GetCurrentHp()
,并且如果该播放器没有hp或hp==0,则该方法返回false,我会认为该名称具有误导性,我更喜欢使用player.isAlive()
方法
从逻辑或软件的角度来看,这本身并没有什么问题,但我不会在6个月内帮助下一个开发人员使用该代码,也不会帮助你自己
在您的情况下,我将使用两种方法进行LayoutPointer
public bool IsValid() // <--- I like when boolean methods represent 'is, can, have' actions, ideas, or properties.
{
return _line.positionCount > 1;
}
然后,
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
if (pointer == null)
{
Debug.LogWarning("IsDrawingOverAllowed: Pointer is null!");
return true; // or false, it depends on your design..
}
if (!pointer.IsValid()) // <-- I also like early returns :D
{
return true;
}
var leadingTrailSegment = pointer.GetLeadingTrailSegment()
return !midline.IsParallelTo(leadingTrailSegment);
}
public bool被绘制为一般允许(布局指针)
{
if(指针==null)
{
LogWarning(“IsDrawingOverAllowed:指针为null!”);
返回true;//或false,这取决于您的设计。。
}
如果(!pointer.IsValid())/我的两分钱:)
tldr:
我宁愿问你为什么想要一个返回布尔值的方法,但是这个名称暗示了另一件事。
如果我有player.GetCurrentHp()
,并且如果该播放器没有hp或hp==0,则该方法返回false,我会认为该名称具有误导性,我更喜欢使用player.isAlive()
方法
从逻辑或软件的角度来看,这本身并没有什么问题,但我不会在6个月内帮助下一个开发人员使用该代码,也不会帮助你自己
在您的情况下,我将使用两种方法进行LayoutPointer
public bool IsValid() // <--- I like when boolean methods represent 'is, can, have' actions, ideas, or properties.
{
return _line.positionCount > 1;
}
然后,
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
if (pointer == null)
{
Debug.LogWarning("IsDrawingOverAllowed: Pointer is null!");
return true; // or false, it depends on your design..
}
if (!pointer.IsValid()) // <-- I also like early returns :D
{
return true;
}
var leadingTrailSegment = pointer.GetLeadingTrailSegment()
return !midline.IsParallelTo(leadingTrailSegment);
}
public bool被绘制为一般允许(布局指针)
{
if(指针==null)
{
LogWarning(“IsDrawingOverAllowed:指针为null!”);
复述