두 가지 질문이 있으며 도움이 필요합니다.유효한/존재하는 값을 확인할 때 Nullable 대 Out 매개 변수
시간이 지남에 따라 변하는 변수/값에 액세스해야하는 클라이언트 코드가 있으며 실제로는 검색시 계산되며 런타임에 여러 번 여러 방법으로 검색되지만 계산은 그렇지 않습니다. 항상 그 요구 사항이 항상 존재하는 것은 아니므로 항상 거짓 또는 null이 반환되고 클라이언트가이를 확인하여 계속 진행할 것인지 결정합니다. 자, 두 가지 접근 방법이 있습니다. 첫 번째는 입니다. 제 고전의 하나입니다. B 그러나 나에게도 좋을 것 같습니다.
A)는 좀 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은 클라이언트 코드가 값을 사용할 때 안전 (유용할까요?)인지 알려줍니다. 이 안전 어떠했는지
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
Vector3 leadingTrailSegment;
if (pointer.GetLeadingTrailSegment(out leadingTrailSegment))
{
return !midline.ParallelTo(leadingTrailSegment);
}
return true;
}
B) 여기가 거짓 인 널 (NULL)의 HasValue 속성의 사실은 클라이언트를 알려줍니다
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
Vector3? leadingTrailSegment = pointer.leadingTrailSegment;
if (leadingTrailSegment.HasValue)
{
return !midline.ParallelTo(leadingTrailSegment.Value);
}
return true;
}
첫 번째 질문 :이 두 가지 방법 중, 어떤 것이 가장 좋습니까? 아니면 그들 사이에 찬반 양론이 있습니까?
두 번째 질문 :
public bool IsDrawingOverAllowed(LayoutPointer pointer)
{
if (pointer.leadingTrailSegment.HasValue)
{
return !midline.ParallelTo(pointer.leadingTrailSegment.Value);
}
return true;
}
이 잘, 잘못 : 나는대로 쓴 클라이언트 B 접근을하는 데 사용? nullable의 Value 속성이 두 번째 호출에 의해 변경되었을 수 있기 때문입니다.
저는 out 매개 변수 접근법을 가장 좋아합니다. if 절에서 결과를 사용할 수 있으며 다른 버전의 C#에서 변수를 인라인으로 선언 할 수도 있지만 nullable에 대한 샷을 제공하고 싶습니다 이와 같은 상황에서 유용합니다 (할당되지 않은 값을 찾을 때뿐만 아니라 내가 사용하는 경우). 나는 누군가가 이것에 대한 그들의 생각을 줄 수 있기를 바랍니다.
감사합니다.
두 번째 질문에 'Vector3? 당신이 다른 지역에있는'Vector3?'를 복사 한 후에는'if (segment.HasValue)'와'return! midline.ParallelTo (segment.Value); ' 불변의 구조체이기 (위해) 때문에,보다 긴 변경이 필요합니다. –
제 추측이 맞았습니까? 나는 클라이언트의 B 접근법에 위의 한 예를 썼기 때문에 그렇게했다. 감사. – Ruri
예, 첫 번째 질문에서 B가 더 나은 방법 일 것입니다. 또한 태그가 잘못되었습니다. 'C# -4.0'은 .NET 4.0이 아닙니다. 2017.1.0 현재 Unity3d C# 6을 지원합니다. –