Reshapper/Rider의 "Possible unintended bypass of lifetime check of underling Unity engine object"는 무엇입니까?

5768 단어 ReSharperRiderUnityC#
제트브레인스가 생산한 비주얼스튜디오 플러그인'Reshaper'도'빨간 펜 선생님'으로 불리며 탑재됐다.NET용 IDE "Rider"
아주 좋은 기능들이 많아요, Reshapper/Rider.자주 사용하는 유닛 개발자도 많죠?
이러한 Reshapper/Rider 기능 중 하나인 "Code Inspections"코드가 안 좋은 부분을 지적하거나'이렇게 하면 더 좋을 것'이라고 수정할 수도 있다.
그렇다면 유니티 고유의'코드 인스피션'은 배경 지식이 필요하고 이해하기 어려운 것들이 있다.바로
「Possible unintended bypass of lifetime check of underlying Unity engine object」
네.
라이더에서는 이런 느낌으로 나온다.

이 투고는 그 배경과 내용을 소개한다.

배경 지식1


GameObject와 Component를 null과 비교할 때 함정이 있습니다.
[SerializeField] private GameObject target; // 参照している。nullじゃない。

private void Awake()
{
    Debug.Log(target == null); // Falseと表示される
    DestroyImmediate(target);
    Debug.Log(target == null); // Trueと表示される
}
위 코드에서 변수 target이 인용한 대상은 비어 있지 않지만 target == null는 사실입니다.
GameObject와 Component의 부모급 Unity EngineObject에서 = 또는bool의 조작자를 정의했습니다.
또한 "대상의 게임Object와 Component가 살아남지 못하면 ==null과 비교하면 진실로 되돌아온다"는 행위다.
관련 기사: "GameObject와 Component를 null과 비교할 때의 함정"

배경 지식2


C#의 "person 오류:. Name"및 "person=null 오류: person. Name"은 서로 다릅니다.
null 조건 연산자에서 공백에 비해 "=="작업자는 비교하지 않습니다.(유형에 대해 ==를 사용하지 않고 혼자 정의된 처리)
유사하게null 합병 산수그러나 마찬가지로 공백과 비교하면'=='조작원의 비교를 하지 않는다.(유형에 대해 ==를 사용하지 않고 혼자 정의된 처리)
관련 기사: "C#의 경우 "person 오류:. Name"과 "person=null 오류: person. Name"은 서로 다릅니다."

배경지식1과 배경지식2가 결합된 주의사항


다음 코드 1 및
// コード1
[SerializeField] private GameObject target;

private void Awake()
{
    DestroyImmediate(target);
    Debug.Log(target == null ? null : target.name); // `Null`と表示される
}
다음 코드 2는
// コード2
[SerializeField] private GameObject target;

private void Awake()
{
    DestroyImmediate(target);
    Debug.Log(target?.name); // `UnassignedReferenceException`が投げられる
}
결과가 다르다.
코드 1에서 = 조작원을 사용했기 때문에 target 살아있다(DestroyImmediate로 파괴), target == null 진짜가 되고 로그에 표시된다Null.
코드2는null조건연산자?.를 사용하기 때문에 ==라고 부르지 않습니다.코드 2의 처리는 대상의 생존과 무관하다.그 결과 처리가 진행되고 대상이 파괴되었다UnassignedReferenceException.

ReShapper/Ride의 Code Inspection이란 무엇입니까?


배경지식1과 배경지식2가 결합된 주의사항
ReShapper/Rider의 Code Inspection의
「Possible unintended bypass of lifetime check of underlying Unity engine object」
뜻, 이유, 장점을 전달했나요?
게임Object와 Component를 null과 비교==할 때 주기가 더해진 처리가 진행된다.한편,null조건연산자?.와null합체연산자??에는 생명주기가 추가되지 않습니다.언뜻 보기에는 같은 코드라도 다른 부분에 주의해야 한다.
자세한 건 이쪽도!
JetBrains/resharper-unity의wiki"Possible unintended bypass of lifetime check of underlying Unity engine object"

사견


나는 개인적으로 UnityEngine.Object의 생존 상태==!=의 결과에 변화가 생길 것이라고 생각하는데 이것은 이해하기 어려운 방법이다...

좋은 웹페이지 즐겨찾기