.NET MAUI를 채택할 계획이 있습니까? NullReferenceException으로 모험을 준비하세요
7303 단어 dotnetcsharptoolingopensource
간략한 소개
MAUI 프로젝트의 전반적인 품질을 판단할 수는 없지만 개발자가 예기치 않은 NullReferenceException에 대한 모든 사용자 보고서를 처리하는 데 상당한 시간을 할애할 것 같습니다.
작성자가 서둘러 코드를 작성했을 수 있습니다. 결과적으로 일부 코드 조각에는 개발자에 따르면 null일 수 있는 참조가 포함되어 있으며 역참조하기 전에 null이 확인되지 않습니다. 더 명확하게 하기 위해 MAUI 6.0.424source code의 일부 조각을 살펴보겠습니다.
왜 그렇습니까?
내가 아래에 나열한 조각들을 보았을 때, 나는 나 자신에게 같은 질문을 던졌다. 뭔가 빠졌거나 MAUI 개발자가 매우 이상한 코드를 작성합니다.
AdaptiveTrigger 클래스의 AttachEvents 함수에서 조각을 살펴보겠습니다.
void AttachEvents()
{
....
_visualElement = VisualState?.VisualStateGroup?.VisualElement;
if (_visualElement is not null)
_visualElement.PropertyChanged += OnVisualElementPropertyChanged;
_window = _visualElement.Window; // <=
....
}
말도 안 돼요. 두 개의 "?."로 판단 "null이 아님"검사를 통해 _visualElement 필드에서 null을 예상할 수 있습니다. 그런 다음 코드는 Window 속성에 액세스하지만 먼저 _visualElement *for *null을 확인하지 않습니다. 분명히 누군가가 그것을 간과했습니다.
좋아, 계속하자. FormattedString 클래스의 조각을 살펴보십시오.
void OnCollectionChanged(....)
{
....
foreach (object item in e.OldItems)
{
var bo = item as Span;
bo.Parent = null; // <=
if (bo != null)
{
....
}
....
}
다시 인접한 라인. 먼저 개발자는 bo를 역참조한 다음 갑자기 null을 확인하기로 결정했습니다. 어떤 경우에 이 코드가 충돌하는지 확실하지 않지만 모두 이상하게 보입니다.
다음은 ListView 클래스의 스니펫입니다.
protected override void SetupContent(Cell content, int index)
{
....
if (content != null)
_logicalChildren.Add(content);
content.Parent = this;
VisualDiagnostics.OnChildAdded(this, content);
}
다시 말도 안되는 소리입니다. 컬렉션에 요소를 추가할 때만 null 검사를 수행하고 속성에 액세스할 때는 검사를 건너뛰는 이유는 무엇입니까?
ShellChromeGallery 클래스의 생성자에서 또 다른 "유용한"null 검사를 찾았습니다.
AppShell AppShell => Application.Current.MainPage as AppShell;
public ShellChromeGallery()
{
....
if (AppShell != null)
{
flyoutBehavior.SelectedIndex = ....;
flyoutHeaderBehavior.SelectedIndex = ....;
}
else
{
flyoutBehavior.SelectedIndex = 1;
flyoutHeaderBehavior.SelectedIndex = 0;
}
AppShell.FlyoutBackdrop = SolidColorBrush.Pink; // <=
}
다시 시작합니다. null을 확인하고 필요한 경우 일부 기본값을 설정한 다음 즉시 충돌합니다.
이상한 조각을 얼마나 자주 만났는지 고려할 때 null을 확인하는 것이 보이는 것과 다르다고 생각하기 시작했습니다. 예를 들어 Unity를 예로 들어 보겠습니다. "=="연산자가 오버로드되고 null 검사가 의도적으로 특이한 방식으로 작동합니다. 그러나 MAUI에서는 그런 것을 보지 못했습니다.
그나저나 왜 그렇습니까?
MAUI는 전문가가 작성하지만 프로젝트가 매우 크고 복잡합니다. 사람들은 실수를 하지만 괜찮습니다. 이상한 점은 다양한 자동화 도구가 이러한 문제를 포착할 수 있음에도 불구하고 프로젝트에 이러한 문제가 포함되어 있다는 것입니다. 이러한 조각을 찾기 위해 C#용 PVS-Studio 정적 분석기를 사용했다고 추측하는 것은 어렵지 않습니다. 제 생각에는 그러한 도구가 MAUI 개발자의 삶을 단순화할 것입니다. 어쨌든 나는 그들이 프로젝트 개발에 성공하기를 바랍니다.
Reference
이 문제에 관하여(.NET MAUI를 채택할 계획이 있습니까? NullReferenceException으로 모험을 준비하세요), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/unicorn_developer/do-you-plan-to-take-on-net-maui-get-ready-for-an-adventure-with-nullreferenceexception-1b62텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)