Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查有效/存在值时的Nullable vs.Out参数_C#_Unity3d_C# 4.0_Nullable_Out - Fatal编程技术网

C# 检查有效/存在值时的Nullable vs.Out参数

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

我有两个问题,我想得到一些帮助

我的客户端代码需要访问随时间变化的变量/值,事实上,它是在检索时计算的,并且在运行时通过许多方法多次检索,但是,它的计算并不总是可能的,因为在这种情况下,对它的要求并不总是存在,返回一个falsenull,客户端将对此进行检查以决定是否继续。现在,我有两种方法,第一种,A,是我的经典方法,B不过,对我来说也不错

A)我有一个out参数的方法,类似于某些C#库上的TryParse方法:

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!”);
复述